You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel多对多关系:查询匹配全部分类数组的文章

如何查询同时包含所有指定分类的文章(多对多关系)

要实现同时拥有所有指定分类的文章查询,你需要确保每个分类的关联条件都被独立验证,以下是两种可行的方案:

方案一:循环分类数组,逐个添加whereHas约束

这种方式最直观,对每个分类单独检查文章是否关联该分类,多个whereHas叠加后会要求文章同时满足所有条件:

$query->when(
    $filters['category'] ?? false,
    function ($query, $categories) {
        foreach ($categories as $categoryName) {
            $query->whereHas('categories', function ($query) use ($categoryName) {
                $query->where('name', $categoryName);
            });
        }
    }
);

方案二:通过统计匹配分类数实现

在单个whereHas中统计匹配指定分类的数量,要求数量等于分类数组的长度,这种方式只需要一次关联查询:

$query->when(
    $filters['category'] ?? false,
    function ($query, $categories) {
        $query->whereHas('categories', function ($query) use ($categories) {
            $query->whereIn('name', $categories)
                  ->groupBy('post_id') // 假设中间表关联字段是post_id
                  ->havingRaw('COUNT(DISTINCT name) = ?', [count($categories)]);
        });
    }
);

为什么你之前的写法无效?

  • 第一种写法用whereIn:会返回只要关联任意一个指定分类的文章,这是whereIn的逻辑——只要匹配数组中任意一项就满足条件。
  • 第二种写法在同一个whereHas里循环where:相当于生成where name = 'food' AND name = 'travel' AND ...,但单条分类记录的name不可能同时等于多个值,所以永远返回空结果。

内容的提问来源于stack exchange,提问作者Thiago

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:32:42