Заказать таблицу из связанной таблицы в Yii2

#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() именем , поэтому вы можете использовать его, за исключением прямого использования имени таблицы