Пагинация 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 сообщениями, упорядоченными по тому, что вы называете своим исходящим полем.

Другие вопросы по тегам