【问题标题】:Laravel whereIn() acting like orWhereIn()Laravel whereIn() 的行为类似于 orWhereIn()
【发布时间】:2018-07-04 14:59:42
【问题描述】:

有3张桌子:

  1. 膳食
  2. 标签
  3. meal_tag

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

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

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

tag1 AND tag2 AND tag3

,但我的查询返回的饭菜有

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

【问题讨论】:

    标签: laravel-5 eloquent where-clause


    【解决方案1】:

    IN()检查一个值是否在一组值内,任何匹配的值都返回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);
            });
        }
    }
    

    【讨论】:

    • 它有效,感谢您的快速回答,我会在 5 分钟内接受,堆栈溢出还不允许它
    猜你喜欢
    • 1970-01-01
    • 2018-02-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2018-09-27
    • 2017-05-30
    相关资源
    最近更新 更多