首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Laravel中基于AND而不是OR过滤类别

在Laravel中基于AND而不是OR过滤类别
EN

Stack Overflow用户
提问于 2020-03-17 17:16:40
回答 1查看 73关注 0票数 2

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

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

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

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

代码语言:javascript
复制
$journalists    = Journalist::where('active', 1)
    ->whereHas('categories', function($q) use ($categoriesIds) {
        $q->whereIn('journalist_category_id', $categoriesIds);
    })->paginate(100);
EN

回答 1

Stack Overflow用户

发布于 2020-03-17 19:54:13

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

当您选择select * from table where id in (10, 20, 30)时,它等同于select * from table where (id = 10 or id = 20 or id = 30),因此这是一个快捷的-so -对于多个OR

为了解决这个问题,你需要使用sql,感谢andreas & boris的帮助

因此,按记者分组,然后选择记者计数等于类别ids计数的位置将解决此问题。

代码语言:javascript
复制
$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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60719351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档