Laravel:查询是否存在关系
问题描述:
我有一个模型Foo
,其中包含hasMany
与Bar
的关系。Laravel:查询是否存在关系
我有类似以下的查询:
$r = Foo::with(['bar' => function($query) {
$query->where('someProp', '=', 10);
})->get()
不过,我只想返回Foo
对象,如果项目有Bar
对象满足查询。
我知道,你可以做这样的事情:
$r = Foo::has('bar')
->with(['bar' => function($query) {
$query->where('someProp', '=', 10);
})->get();
但是,检查是否有任何bar
项目存在。若一个bar
项目与someProp = 10
我有一个解决方案最接近的存在是这样的:
$r = Foo::has('bar')
->whereHas('bar', function ($query) {
$query->where('someProp', '=', 10);
})
->with(['bar' => function($query) {
$query->where('someProp', '=', 10);
})->get();
但它显然不是一个很好的解决方案,可能是非常低效的,因为我是在重复的查询。
我该如何解决这个问题?
答
如果条件是固定的,你可以这样定义
public function bar_fix()
{
return $this->hasMany(Bar::class)->where('someProp', 10);
}
Foo中另一关系,然后在查询中使用这种关系:
$r = Foo::has('bar_fix')->with('bar_fix')->get();
然而
,这仅仅是有用的如果条件解决..