gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:21:15 38 4
gpt4 key购买 nike

我的 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 加载它,我会收到以下错误:

在 null 上调用成员函数 addEagerConstraints()

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

最佳答案

您以错误的顺序声明了您的关系,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');
}

关于php - Laravel Eloquent - 如果列值为 NULL 或 0,则不运行关系查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44699673/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com