【问题标题】:Laravel pagination with relations and additional checks带有关系和附加检查的 Laravel 分页
【发布时间】:2019-06-15 00:57:18
【问题描述】:

我正在尝试使用我的对话模型进行分页,该模型具有许多消息模型。 ($this->hasMany('App\Message');)

所以每个对话都可以有多个消息(对话类似于线程)。消息有两个可能的传出和传入方向。

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

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

到目前为止,这就是我的对话方式,只是基本的分页。 我使用分页是因为我可以进行数百万左右的大量对话。这就是为什么我只需要提取至少包含三条消息并且最后一条消息具有传出方向的对话。

我正在使用 PostgreSQL

【问题讨论】:

  • 你如何定义方向?是在sms_status 字段中吗?
  • 不,sms_status 是消息的关系。消息有方向字段@Mozammil
  • 我添加了我的答案。让我知道它是否适合你:)

标签: sql laravel eloquent pagination laravel-collection


【解决方案1】:

我可能会如下定义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);

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • OP 希望最后一条消息发出:)
    • 好吧,这解决了我的问题,它只有一个错误。 whereHas('messages', null,'>=', 3) 。因为第二个参数是回调,第三个是操作符。但是仍然不起作用的是这个 orderBy。仅当最后一条消息具有传出方向时,我才需要进行对话吗?我不会像 if ($lastMessage->direction == 'outgoing') return $record @NMahurin
    • 那将使用whereHas()中的回调来获取。但是,如果不知道消息表上有哪些字段,就很难写出来。
    猜你喜欢
    • 2021-12-18
    • 2014-06-12
    • 2021-01-16
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 2022-01-16
    • 2021-05-06
    • 2021-03-11
    相关资源
    最近更新 更多