首页 > 解决方案 > Laravel whereIn() 的作用类似于 orWhereIn()

问题描述

有3张表:

  1. 膳食
  2. 标签
  3. 餐标签

我想从 url 查询中获取所有包含所有标签的餐点。

例如:.../api/query?tags=1,2,3

在这个例子中,我想获取所有有

标签1 AND标签2 AND标签3

,但我的查询返回有

标签 1标签2标签 3

这是我的查询:

   $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);
        });
    }

标签: laravel-5eloquentwhere-clause

解决方案


IN()检查一个值是否在一组值内,对于任何匹配的值然后返回 true,它不会验证所有值是否存在,

为了实现您正在尝试的内容,您需要单独检查每个标签 ID whereHas,以确保所有这些都存在

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);
        });
    }
}

推荐阅读