Laravel:查询是否存在关系

问题描述:

我有一个模型Foo,其中包含hasManyBar的关系。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(); 
然而

,这仅仅是有用的如果条件解决..