Пагинация Laravel с отношениями и дополнительными проверками - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь сделать нумерацию страниц с моей моделью разговора, в которой есть много моделей сообщений. ($this->hasMany('App\Message');)

Таким образом, в каждом диалоге может быть несколько сообщений (разговор напоминает тему). Сообщения имеют два возможных направления исходящих и входящих.

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

 $con = Conversation::with(['messages', 'messages.sms_status'])->paginate(15);

Так я до сих пор веду разговор, просто базовая нумерация страниц. Я использую нумерацию страниц, потому что у меня много разговоров о нескольких миллионах. Вот почему мне нужно извлекать только те разговоры, которые содержат не менее трех сообщений и в которых последнее сообщение имеет исходящее направление.

Я использую PostgreSQL

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Я бы определил отношение 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);
0 голосов
/ 21 января 2019

Вы можете использовать whereHas() и ограничить with(), поскольку вы можете передать третий параметр в whereHas(), который указывает количество.Например:

$con = Conversation::with(['messages' => function($query){
    return $query->orderBy('outgoing', 'desc')
}, 'messages.sms_status'])
->whereHas('messages', null, '>=', 3)->paginate(15);

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

...