我的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
答案 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');
}