#php #postgresql #yii2 #yii2-advanced-app
#php #postgresql #yii2 #yii2-advanced-app
Вопрос:
У меня есть таблица с именем "video"
, которого "likes"
в ней нет, потому что я создал другую таблицу "video-like"
для присоединения каждого подобного к "user"
. Но я хочу отсортировать видео по лайкам, и я не знаю, как это сделать.
Я использую фреймворк Yii2 и PostgreSQL.
В этом примере я создал запрос, который сортируется от новых к старым видео. Это просто, потому что мне не нужно обращаться к другой таблице, чтобы сделать это.
$this->orderBy(['created_at' => SORT_DESC]);
Любая помощь будет полезна!
Комментарии:
1. Пожалуйста, опубликуйте любой код, который вы пытались реализовать для достижения результата.
Ответ №1:
У вас может быть 2 вложенных выбора.
$query = Model()::find();
$subQuery = ModelLikes()::find()
->select("COUNT(*) AS amount")
->groupBy([
ModelLikes::tableName() . '.source_id'
])
->orderBy(['amount' => SORT_DESC]);
$query->leftJoin(['T' => $subQuery],
Model::tableName() . ".id= T.source_id");
$data = $query->all();
вы должны изменить имя и поле модели на основе ваших моделей.
source_id — это идентификатор видео в таблице лайков
Комментарии:
1. Большое вам спасибо за ответ, но я немного смущен тем, как это реализовать, я никогда не видел, чтобы точки использовались таким образом… Я попытался заменить source_id на video_id, который является идентификатором видео в таблице viedo_likes, а каждая «Модель» — соответствующей моделью. но когда я запускаю его, он говорит, что video.id не существует.
2. Выполняемый SQL был: ВЫБЕРИТЕ «видео».* ИЗ «video» ЛЕВОГО СОЕДИНЕНИЯ (ВЫБЕРИТЕ COUNT (*) КАК «количество» ИЗ ГРУППЫ «video_like» ПО «video_like».»video_id» УПОРЯДОЧИТЬ ПО «amount» DESC) «T» НА «video».id = T.video_id
3. В yii2 у каждой модели есть метод с
tableName()
именем , поэтому вы можете использовать его, за исключением прямого использования имени таблицы