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

时间:2014-07-31 15:38:28

标签: 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而不是一个空集合,我会得到所有行为空command_id

这可以通过此$command->rows调用生成的SQL完美解释:

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

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

感谢。

1 个答案:

答案 0 :(得分:3)

处理此问题的两种方法:

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

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

2 您还可以更改架构,因此外键不可为空,但Rows没有Command的值将具有0值。


现在,我认为这是正确的行为。您正在尝试获取某些内容,并将null作为先决条件,以便找到这些行。这在业务逻辑方面是出乎意料的,但绝对没有错。

没有提到我无法思考,为什么你想在新实例化的模型上调用关系,显然没有任何关系。除非只是好奇心。