【问题标题】:Eloquent laravel WhereIn All雄辩的 laravel WhereIn All
【发布时间】:2018-01-17 10:50:24
【问题描述】:

我想退回所有类别的所有商品。

$items = DB::table('items')
              ->join('catitem_item', 'catitem_item.item_id', '=', 'items.id')
              ->whereIn('catitem_item.catitem_id', $cats)->paginate(10);

这个查询我现在有什么返回具有类别 1 或 2 或 3 的项目。 我需要的是返回类别 1 和 2 和 3 的物品。

我怎样才能做到这一点?

【问题讨论】:

  • 您能否进一步扩展您的问题?很难理解。你现在的输出是什么?

标签: php mysql sql laravel-5 eloquent


【解决方案1】:

试试这个:

$items = DB::table('items')
    ->join('catitem_item', 'catitem_item.item_id', '=', 'items.id')
    ->whereIn('catitem_item.catitem_id', $cats)
    ->groupBy('items.id')
    ->having(DB::raw('count(*)'), '=', count($cats))
    ->select('items.*')
    ->paginate(10);

使用HAVING count(*) = 3,查询将只返回包含所有列出类别的项目。

【讨论】:

  • SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以了解在“3?”附近使用的正确语法。在第 1 行
  • @TomKur 我修复了一些问题。立即尝试。
  • thx 它起作用了,但我仍然需要加入与我认为 HAVING count(*) = 3 无效的项目有多对多关系的其他表列表,因为将超过 3项目计数,知道我应该对查询进行哪些更改吗?
  • 我可能会编写一个带有子查询的原始查询。使用 QueryBuilder 编写子查询会非常麻烦。考虑写一个新的详细问题,因为这个问题已经回答了。如果您愿意,请在此处发布链接。
【解决方案2】:

试试这样: 其中 $cats= [1,2,3];

$items = DB::table('items')
->join('catitem_item', 'catitem_item.item_id', '=', 'items.id')
->whereIn('catitem_item.catitem_id', $cats)
->paginate(10);

它的返回项目为类别 1 和 2 和 3。这意味着它用于 AND 操作。

【讨论】:

  • 一个列值不能同时等于三个不同的值。 x = 1 AND x = 2 AND x = 3 始终为 FALSE。所以你的查询永远不会返回任何行。
  • 是的,你是对的,当我们想要所有类别时,我们会像上面那样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 2014-11-08
  • 1970-01-01
相关资源
最近更新 更多