我在Command
Eloquent模型中定义了一个hasMany关系:
public function rows()
{
return $this->hasMany('AcmeModelsRow')
}
在我的例子中,行可以链接到命令,也可以不链接。所以我的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选择考虑有效的空外键…你觉得呢,这是虫子吗?我错过什么了吗?防止这种行为的最好方法是什么?
谢谢。
有两种处理方法:
1为了防止这种行为,在您当前的设置中,您需要在关系定义上添加not null
子句:
public function rows()
{
return $this->hasMany('AcmeModelsRow')->whereNotNull('rows.command_id');
}
2你也可以改变你的模式,所以外键是不可空的,但是没有Command
的Rows
在那里会有0
的值。
现在,我认为这无论如何都是正确的行为。您正在尝试获取某些东西,给定
null
作为先决条件,因此它会找到这些行。就业务逻辑而言,这是出乎意料的,但绝对没有错。且不说,我不明白,为什么你要在新实例化的模型上调用关系,这显然没有任何关系。除非你只是好奇。