Laravel分页与关系和其他检查

时间:2019-01-21 15:42:32

标签: sql laravel eloquent pagination laravel-collection

我正在尝试对我的会话模型进行分页,该模型具有许多消息模型。 (case "B": score++; System.out.println("Correct!"); isValidInput = true; break; case "A": case "C": System.out.println("Wrong, correct answer is B"); isValidInput = true; break;

因此每个对话可以有多个消息(对话就像线程)。消息有两个可能的方向,即传出和传入。

我要实现的目标是使所有对话至少包含三个消息。以及最后一条消息的传出方向。

$this->hasMany('App\Message');

到目前为止,这是我开始基本对话的方式。 我使用分页是因为我可以在数以百万计的人之间进行很多对话。这就是为什么我只需要退出至少包含三个消息且最后一条消息具有传出方向的对话。

我正在使用PostgreSQL

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

您可以使用whereHas()并约束with(),因为您可以将第三个参数传递给whereHas()来指示计数。喜欢:

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

这将返回至少包含3条消息的所有对话,并按您称为外发字段的顺序排序。