php - 拉维尔 4 : prevent lazy load hasMany relation when foreign_key is null (optional relation)

标签 php sql laravel laravel-4 eloquent

我在 Command Eloquent 模型中以这种方式定义了一个 hasMany 关系:

public function rows()
{
   return $this->hasMany('\Acme\Models\Row')
}

在我的例子中,行可以链接到命令,也可以不链接。所以我的 Row 迁移文件包含一个可为空的外键:

$table->integer('command_id')->unsigned()->nullable()->index();
$table->foreign('command_id')->references('id')->on('commands')->onDelete('set null');

没什么特别的。

我意识到,如果我实例化一个新的 Command 对象并调用 $command->rows,而不是一个空的集合,我会得到所有带有 null 的行command_id.

这个 $command->rows 调用生成的 SQL 完美地解释了这一点:

select * from `rows` where `rows`.`command_id` is null

我觉得 Laravel 选择认为有效的空外键很奇怪......你怎么看:这是一个错误吗?我错过了什么吗?防止这种行为的最佳方法是什么?

谢谢。

最佳答案

两种处理方式:

1 为了防止这种行为,在您当前的设置中,您需要在关系定义中添加 not null 子句:

public function rows()
{
   return $this->hasMany('\Acme\Models\Row')->whereNotNull('rows.command_id');
}

2 您还可以更改架构,因此外键不可为空,但没有 CommandRows 将具有 0 那里的值(value)。


现在,我认为这无论如何都是正确的行为。您正在尝试获取某些内容,给定 null 作为先决条件,因此它会找到那些行。这在业务逻辑上是出乎意料的,但绝对没有错。

更不用说我想不通,为什么您想在新实例化的模型上调用关系,显然没有。除非只是出于好奇。

关于php - 拉维尔 4 : prevent lazy load hasMany relation when foreign_key is null (optional relation),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25063201/

相关文章:

php - 使用 strftime 返回 00 获取 2011 年 1 月 1 日的周数

php - 为什么单例在 PHP 环境下这么糟糕?

php - Laravel5.2 调度 :run don't work with cron job

sql - 在 PostgreSQL 查询中转义列名中的字符?

java - 如何创建我自己的 jOOQ 结果?

sql server - 如何修改查询语句中的值?

javascript - 从数据库中删除后,Vue.js $remove 不删除元素

Laravel 基本测试 assert false.. 但它有效吗?

php - 安装 Mediawiki 后出现空白页

php - Laravel 验证登录