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

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

在我当前的代码中,我使用了whereHas命令,但这只在数组$categoriesIds中查找每个journalist_category_ids,并导致选择OR组合:
$journalists = Journalist::where('active', 1)
->whereHas('categories', function($q) use ($categoriesIds) {
$q->whereIn('journalist_category_id', $categoriesIds);
})->paginate(100);发布于 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计数的位置将解决此问题。
$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);https://stackoverflow.com/questions/60719351
复制相似问题