里面的Where子句在Eloquent中被忽略

时间:2017-04-09 19:11:03

标签: laravel eloquent

我试图使用 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 子句被忽略,因为结果集合包括状态值不同于付费的投资。

有没有人知道发生了什么事?

4 个答案:

答案 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)

您会混淆whereHaswith

仅当查询返回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()。几周前我遇到了类似的问题。顺便说一下,问题和你所做的功能实例之间唯一真正的区别。