Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Есть таблица статей, категорий и связующая таблица. Отношение ManyToMany.
Нужно получить статьи, которые одновременно находятся в указанных категориях (id категорий получаем массивом из формы).
На sql получилось так:
SELECT * FROM `articles` as a
JOIN `article_category` as p1
JOIN `article_category` as p2
on (p1.article_id=p2.article_id and p1.category_id=16 and p2.category_id=51)
where a.id=p1.article_id
Как это теперь переписать на query builder, учитывая, что в исходном массиве категорий может быть больше?
Или может есть лучший способ организовать подобный запрос?
Не в сети
Так ничего толком и не получилось, поэтому решила ограничиться максимум тремя категориями. Если кому вдруг будет нужно, вот что получилось:
$num_categories = count($filter['selected_category']);
$query = DB::table('articles');
switch ($num_categories) {
case 1:
$query->join('article_category as ac', 'articles.id', '=', 'ac.article_id')
->where('ac.category_id', '=', $filter['selected_category']);
break;
case 2:
$query->join('article_category as ac1', 'articles.id', '=', 'ac1.article_id')
->join('article_category as ac2', 'ac1.article_id', '=', 'ac2.article_id')
->where('ac1.category_id', '=', $filter['selected_category'][0])
->where('ac2.category_id', '=', $filter['selected_category'][1]);
break;
case 3:
$query->join('article_category as ac1', 'articles.id', '=', 'ac1.article_id')
->join('article_category as ac2', 'ac1.article_id', '=', 'ac2.article_id')
->join('article_category as ac3', 'ac2.article_id', '=', 'ac3.article_id')
->where('ac1.category_id', '=', $filter['selected_category'][0])
->where('ac2.category_id', '=', $filter['selected_category'][1])
->where('ac3.category_id', '=', $filter['selected_category'][2]);
break;
default:
break;
}
$data['articles'] = $query->get();
Не в сети
Страницы 1