@Gudzera

Как перевести mysql запрос в Active Record Yii2?

Есть запрос который отлично работал долгое время на моем рукописном сайте до той поры, когда мне захотелось перепилить все свои сайты под Yii2 заодно и разобраться с данной основой.

SELECT i.id, i.src_small as src FROM ideas i JOIN ideas_filters f USING (id) WHERE f.filter IN ($array) GROUP BY i.id HAVING COUNT(DISTINCT f.filter) = '.count($array),' ORDER BY i.id DESC


В Yii2 я использую ActiveRecord, запрос без моих извращений:
$query = Ideas::find()->select('id, src_small')->where(['theme' => $theme->id])->orderBy('id DESC');


Специалисту Yii2 будет легко перевести данный запрос в необходимый формат. Хелпми.

Вообще интересуют любые варианты данного запроса, ведь может у кого есть вариант получше моего.
Имеется таблица с идеями, есть таблица с фильтрами, у каждой идеи может быть много фильтров, есть связующая таблица фильтры_идей. Задача, вывести все идеи по выбранным фильтрам.
  • Вопрос задан
  • 432 просмотра
Решения вопроса 1
@AlikDex
Ideas::find()
    ->select(['i.id', 'i.src_small as src']) // Возможно просто одной сторокой select('i.id, i.src_small as src'). Проверить под рукой правильность нет.
    ->from(['i' => Ideas::tableName()])
    ->join('JOIN', ['f' => IdeasFilters::tableName()], 'f.id=i.id') // USING в yii2 нету поэтому так
    ->where(['f.filter' => $array]) // $array чистый массив в 1 колонку с числовыми индексами 0,1,2 etc. В общем обычный массив вида [23,43,52]
    ->groupBy('i.id')
    ->having(['COUNT(DISTINCT f.filter)' => count($array)])
    ->orderBy(['i.id' => SORT_DESC])
    ->all(); // или one() смотря что нужно.

Классы названы стандартно при создании моделей через gii. Если у вас другие модели, то измените название. В целом должно работать.

P.S.
Забыл. У модели Ideas нужно будет добавить свойство
public $src;
Т.к. дефолтно его нет, но для объекта AR оно будет использоваться(в запросе есть i.src_small as src). Однако Yii не позволит создать "на лету" это свойство, и поэтому надо его прописать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@McMike
Ну вы как минимум все еще можете использовать голый sql в ActiveRecord
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы