Laravel 4:防止当foreign_key为null(可选关系)时延迟加载hasMany关系


Laravel 4: prevent lazy load hasMany relation when foreign_key is null (optional relation)

我在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选择考虑有效的空外键…你觉得呢,这是虫子吗?我错过什么了吗?防止这种行为的最好方法是什么?

谢谢。

有两种处理方法:

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

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

2你也可以改变你的模式,所以外键是不可空的,但是没有CommandRows在那里会有0的值。


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

且不说,我不明白,为什么你要在新实例化的模型上调用关系,这显然没有任何关系。除非你只是好奇。