我正在使用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
部分可选,导致了比应该更多的结果。
所以,我的问题是:在我雄辩的查询中我做错了什么?
答案 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)