雄辩查询错误

时间:2018-01-16 10:53:15

标签: laravel eloquent

我正在使用Laravel 5.0

我基本上想要这种类型的查询:

  

(a ='x'和b ='y')或(a ='xy')

users books

    $users= \App\User::whereHas('books', function($q) use ($x, $y){
        $q->where(function ($query) use ($x, $y){
            $query->where('a','=', $x)->where('b', '=',$y);
        })
        ->orWhere(function ($query2) use ($x, $y){
            $query2->where('a','=',$x.$y);
        });
    });

我当然有用户:

public function books()
{
    return $this->belongsTo('App\Book');
}

但如果检查通过"toSql()"生成的SQL,我会得到这个:

  from users where (select count(*) from books where 
    users.book_id = books.id 
    and 
    (a = ? and b = ?) 
    or 
    (a = ?)
  ) >= 1

这显然不是预期的查询,因为它引发了users.book_id=books.id部分可选,导致了比应该更多的结果。

所以,我的问题是:在我雄辩的查询中我做错了什么?

1 个答案:

答案 0 :(得分:1)

没有必要有两个不同的嵌套轮胎。整个分组都应该在同一个括号内。

$users= \App\User::whereHas('books', function($q) use ($x, $y){
    $q->where(function ($query) use ($x, $y){
        $query->where('a','=', $x)
              ->where('b', '=',$y)
              ->orWhere('a','=',$x.$y);
    });
});

A和B或C在功能上等同于(A和B)或(C)