Сортировка 2х таблиц

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
lammer228
Сообщения: 8
Зарегистрирован: 2018.08.18, 11:03

Сортировка 2х таблиц

Сообщение lammer228 »

Связь пользователя с постами

Код: Выделить всё

public function getPosts()
{
return $this
->hasMany(Posts::className(), ['id_user' => 'id'])
->orderBy(['posts.id' => SORT_DESC])
;
}
Показывает всех 10 пользователей, но вот как показать менее активных пользователей, т.е. сначала тех кто вообще не постит, затем того кто постил давно

Код: Выделить всё

User::find()
->with('posts')
->where(['active_user' => 1])
->limit(10)
->all()
uEhlO4a
Сообщения: 70
Зарегистрирован: 2017.08.12, 19:19

Re: Сортировка 2х таблиц

Сообщение uEhlO4a »

User::find()
->distinct()
->joinWith('posts')
->orderBy(['posts.id' => ASC, 'posts.created' => DESC)
->where(['user.active_user' => 1])
->limit(10)
->all()

не проверял, но по идее что-то такое
Toshus
Сообщения: 14
Зарегистрирован: 2018.06.06, 21:06

Re: Сортировка 2х таблиц

Сообщение Toshus »

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

Здесь нужен запрос из таблицы user, и дополнительно подзапросом вытащить в отдельное поле дату последнего поста по каждому пользователю. С помощью ф-ии IFNULL() заменить NULL на 0, например (это у тех пользователей, у которых нет постов). И отсортировать по этому полю по возрастанию.

Т.е. запрос к БД будет примерно такой:

Код: Выделить всё

SELECT user.*, IFNULL((SELECT MAX(posts.created) FROM posts WHERE posts.user_id=user.id),0) as post_date
FROM user
WHERE user.active_user = 1
ORDER BY post_date
LIMIT 10
Как это выразить через ActiveQuery - подумайе сами.
Ответить