我试图使用 whereHas 进行查询。查询是这样的:
$projects = Project::whereHas('investments', function($q) {
$q->where('status','=','paid');
})
->with('investments')
->get();
我使用Postgres驱动程序使用Laravel 5.2。
项目模型是:
public function investments()
{
return $this->hasMany('App\Investment');
}
投资模型有:
public function project() {
return $this->belongsTo('App\Project');
}
项目表包含字段ID,字段......
投资表的字段为id,project_id,status,created_at
我的问题是查询运行并返回至少有一项投资的项目集合,但 whereHas 中的 where 子句被忽略,因为结果集合包括状态值不同于付费的投资。
有没有人知道发生了什么事?
答案 0 :(得分:4)
我相信这就是你需要的
$projects = Project::whereHas('investments', function($q) {
$q->where('status','=','paid');
})->with(['investments' => function($q) {
$q->where('status','=','paid');
}])->get();
whereHas
将检查所有投资paid
的项目,with
将加载所有这些投资。
答案 1 :(得分:3)
您会混淆whereHas
和with
。
仅当查询返回true时,with
方法才允许您加载关系。
whereHas
方法只允许您获得具有对查询返回true的关系的模型。
因此,您只需使用with
而不是与whereHas
混合使用:
$projects = Project::with(['investments' =>
function($query){ $query->where('status','=','paid'); }])
->get();
答案 2 :(得分:1)
试试这样:
$projects = Project::with('investments')->whereHas('investments', function($q) {
$q->where('status','like','paid'); //strings are compared with wildcards.
})
->get();
答案 3 :(得分:1)
更改订单。在whereHas()之前使用with()。几周前我遇到了类似的问题。顺便说一下,问题和你所做的功能实例之间唯一真正的区别。