Это не проблема спецификации 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 [спасибо Андреасу и Борису за помощь]
, так что группировка по журналистам, а затем выберите, где число журналистов равно количеству идентификаторов категорий, которые решат проблему.
$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);