Laravel Eloquent - 如果列值为NULL或0,则不运行关系查询

时间:2017-06-22 12:39:15

标签: php mysql laravel eloquent

我的Eloquent Models中有各种各样的关系,如下所示:

public function main_image()
{
    return $this->hasOne(Media::class, 'id', 'main_image_id');
}

但是,如果main_image_id为null或0,它将运行SQL查询,因此我最终得到了许多类似的查询:

select * from `media` where `media`.`id` is null and `media`.`id` is not null limit 1

这显然不会返回任何东西,但仍会浪费资源。有没有办法自动检查?

目前我所做的是有一个方法,比如hasMainImage(),检查main_image_id不是null而不是0,但是当前很多系统已经使用了这些关系,我很想知道如果我可以将检查添加到关系方法本身?

我已经尝试添加一个检查并返回null如果该列没有实际值,但我有Exception它必须返回一个Relation对象。或者,如果我尝试Eager加载它,我会收到以下错误:

Call to a member function addEagerConstraints() on null

public function main_image()
{
    if (!$this->main_image_id) {
        return null;
    }

    return $this->hasOne('App\Modules\Media\Models\Media', 'id', 'main_image_id');
}

感谢您的帮助!

编辑: 一个更明显的例子:

$page = Page::find(1);
var_dump($page->main_image); // This will run a query as shown above that is guaranteed to return nothing
// Since at this point system knows that $page->main_image_id is 0 or null, I would like to use that to not run the query and automatically set $page->main_image to null

1 个答案:

答案 0 :(得分:0)

你以错误的顺序宣布你的关系,Eloquent documentation对此很清楚。

没有任何意义的实体(你可能会说没有它的“父”)应该包含“belongsTo”关系(正如文档所说的那样)。

对于演示,假设您有用户模型,并且您有关于该用户的许多详细信息,因此您可以创建详细信息模型。

现在用户模型应该有详细的关系:

public function detail() {
    return $this->hasOne('App\Detail', 'user_id', 'id'); //you can see the difference here from your code sample, you have 2nd and 3rd parameter reversed
}

详细模型应具有用户关系:

public function user()
{
    return $this->belongsTo('App\User');
}