我在 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 您还可以更改架构,因此外键不可为空,但没有 Command
的 Rows
将具有 0
那里的值(value)。
现在,我认为这无论如何都是正确的行为。您正在尝试获取某些内容,给定 null
作为先决条件,因此它会找到那些行。这在业务逻辑上是出乎意料的,但绝对没有错。
更不用说我想不通,为什么您想在新实例化的模型上调用关系,显然没有。除非只是出于好奇。
关于php - 拉维尔 4 : prevent lazy load hasMany relation when foreign_key is null (optional relation),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25063201/