【问题标题】:Filter categories on AND instead of OR basis in Laravel在 Laravel 中基于 AND 而不是 OR 过滤类别
【发布时间】:2020-06-28 08:31:38
【问题描述】:

我想根据他们撰写的类别(例如体育、音乐)过滤记者。当用户选择多个类别时,例如体育和音乐,它应该只显示正在撰写有关体育和音乐的记者。目前,我只过滤了撰写有关体育和/或音乐的记者。

用户选择的类别用数组表示:

并且组合记者和类别组合在链接表中定义:

在我当前的代码中,我使用 whereHas 命令,但这只会在数组 $categoriesIds 中查找每个记者类别 ID 并导致选择 OR 组合:

$journalists    = Journalist::where('active', 1)
    ->whereHas('categories', function($q) use ($categoriesIds) {
        $q->whereIn('journalist_category_id', $categoriesIds);
    })->paginate(100);

【问题讨论】:

    标签: laravel eloquent filtering


    【解决方案1】:

    这不是 laravel 规范问题,更多的是关于 MySQL 而不是 Laravel。

    当您选择 select * from table where id in (10, 20, 30) 时,它等同于 select * from table where (id = 10 or id = 20 or id = 30),因此它是多个 OR 的快捷方式 - 可以这么说

    要解决这个问题,您需要使用 sql [感谢 andreas & boris 的帮助]

    所以按记者分组,然后选择记者人数等于类别 id 的人数的地方将解决问题。

    $journalists    = Journalist::where('active', 1)
    ->whereHas('categories', function($q) use ($categoriesIds) {
        $q->select('journalist_id', \DB::raw('count(journalist_id) as jcount'));
        $q->whereIn('journalist_category_id', $categoriesIds);
        $q->groupBy('journalist_id');
        $q->having('jcount', count($categoriesIds));
    })->paginate(100);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-17
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多