Laravel whereIn() 的行为类似于 orWhereIn()
Laravel whereIn() acting like orWhereIn()
有 3 个表:
- 饭菜
- 标签
- meal_tag
我想从 url 查询中获取包含所有标签的所有餐点。
例如:.../api/query?tags=1,2,3
在这个例子中,我想获取包含
的所有餐点
tag1 AND tag2 AND tag3
,但我的查询 returns 餐有
tag1 OR tag2 OR tag3
这是我的查询:
$query = Meal::query();
...
if ($request->has('tags')) {
$inputTags = $request->query('tags');
$tags = explode(',', $inputTags);
$query = $query->whereHas('tags', function($q) use ($tags) {
$q->whereIn('tags.id', $tags);
});
}
IN()
检查一个值是否在一组值中,对于任何匹配的值 return true,它不验证所有值是否存在,
要实现您正在尝试的目标,您需要使用 whereHas
单独检查每个标签 ID,以确保所有这些都存在
if ($request->has('tags')) {
$inputTags = $request->query('tags');
$tags = explode(',', $inputTags);
foreach($tags as $tag){
$query = $query->whereHas('tags', function($q) use ($tag) {
$q->where('id','=', $tag);
});
}
}
有 3 个表:
- 饭菜
- 标签
- meal_tag
我想从 url 查询中获取包含所有标签的所有餐点。
例如:.../api/query?tags=1,2,3
在这个例子中,我想获取包含
的所有餐点tag1 AND tag2 AND tag3
,但我的查询 returns 餐有
tag1 OR tag2 OR tag3
这是我的查询:
$query = Meal::query();
...
if ($request->has('tags')) {
$inputTags = $request->query('tags');
$tags = explode(',', $inputTags);
$query = $query->whereHas('tags', function($q) use ($tags) {
$q->whereIn('tags.id', $tags);
});
}
IN()
检查一个值是否在一组值中,对于任何匹配的值 return true,它不验证所有值是否存在,
要实现您正在尝试的目标,您需要使用 whereHas
单独检查每个标签 ID,以确保所有这些都存在
if ($request->has('tags')) {
$inputTags = $request->query('tags');
$tags = explode(',', $inputTags);
foreach($tags as $tag){
$query = $query->whereHas('tags', function($q) use ($tag) {
$q->where('id','=', $tag);
});
}
}