Пагинация Laravel с отношениями и дополнительными проверками
Я пытаюсь сделать нумерацию страниц с моей моделью разговора, которая имеет много моделей сообщений. ($this->hasMany('App\Message');
)
Таким образом, каждый разговор может иметь несколько сообщений (разговор является чем-то вроде темы). Сообщения имеют два возможных направления исходящих и входящих.
Я пытаюсь добиться того, чтобы все разговоры содержали как минимум три сообщения. И где последнее сообщение имеет исходящее направление.
$con = Conversation::with(['messages', 'messages.sms_status'])->paginate(15);
Так я до сих пор разговариваю, просто базовая нумерация страниц. Я использую нумерацию страниц, потому что у меня много разговоров о нескольких миллионах. Вот почему мне нужно вытащить только те разговоры, в которых есть как минимум три сообщения и где последнее сообщение имеет исходящее направление.
Я использую PostgreSQL
2 ответа
Я бы наверное определил lastMessage()
отношения следующим образом:
public function lastMessage()
{
return $this->hasOne(Message::class)->latest();
}
..и тогда я смогу ограничить свой запрос следующим образом:
$con = Conversation::with('messages.sms_status')
->whereHas('lastMessage', function($query) {
$query->where('direction', 'outgoing');
})
->has('messages', '>=', 3)
->paginate(15);
Ты можешь использовать whereHas()
и ограничивая with()
, так как вы можете передать третий параметр whereHas()
это указывает на количество. Подобно:
$con = Conversation::with(['messages' => function($query){
return $query->orderBy('outgoing', 'desc')
}, 'messages.sms_status'])
->whereHas('messages', null, '>=', 3)->paginate(15);
Это вернет все разговоры, по крайней мере, с 3 сообщениями, упорядоченными по тому, что вы называете своим исходящим полем.