我在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
而不是一个空集合,我会得到所有行为空command_id
。
这可以通过此$command->rows
调用生成的SQL完美解释:
select * from `rows` where `rows`.`command_id` is null
我认为Laravel选择考虑有效的空外键是很奇怪的......你怎么看:这是一个错误吗?我错过了什么吗?什么是防止这种行为的最佳方法?
感谢。
答案 0 :(得分:3)
处理此问题的两种方法:
1 为了防止这种行为,使用当前的设置,您需要在关系定义中添加not null
子句:
public function rows()
{
return $this->hasMany('\Acme\Models\Row')->whereNotNull('rows.command_id');
}
2 您还可以更改架构,因此外键不可为空,但Rows
没有Command
的值将具有0
值。
现在,我认为这是正确的行为。您正在尝试获取某些内容,并将null
作为先决条件,以便找到这些行。这在业务逻辑方面是出乎意料的,但绝对没有错。
没有提到我无法思考,为什么你想在新实例化的模型上调用关系,显然没有任何关系。除非只是好奇心。