Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 17.01.2015 22:23:41

Нужна помощь по query builder

Есть таблица статей, категорий и связующая таблица. Отношение 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, учитывая, что в исходном массиве категорий может быть больше?
Или может есть лучший способ организовать подобный запрос?

Не в сети

#2 18.01.2015 17:14:29

Re: Нужна помощь по 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();

Не в сети

Подвал раздела