Отфильтруйте категории по И вместо ИЛИ в Laravel - PullRequest
2 голосов
/ 17 марта 2020

Я бы хотел отфильтровать журналистов по категориям, о которых они пишут (например, Спорт, Муси c). Когда пользователь выбирает несколько категорий, например, спорт и музыка c, он должен показывать только журналиста, пишущего о спорте и музыке c. В настоящее время мне удалось отфильтровать только журналистов, которые пишут о спорте И / ИЛИ Musi c.

Категории, выбранные пользователем, представлены в массиве:

enter image description here

И комбинация журналистов и комбинация категорий определены в таблице ссылок:

enter image description here

В моем текущем коде я использую команду whereHas, но это только ищет каждый из journalist_category_ids в массиве $ CategoriesIds и приводит к выбору комбинации OR:

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

1 Ответ

0 голосов
/ 17 марта 2020

Это не проблема спецификации 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);
...