【问题标题】:orderby with eager loading, laravel带有急切加载的orderby,laravel
【发布时间】:2018-12-11 09:26:00
【问题描述】:

我有一个名为 chat 的表,它与用户和消息连接(消息与用户连接),查询工作正常,只是我尝试使用 created_at(desc)添加 orderby,但它必须来自表消息。帮帮我。提前致谢。以下是我的查询,

return new GroupDirectChat(
    Chat::with(['messages.users', 'users' => function ($query) {
        $query->where('id', '!=', Auth::id());
    }])
        ->where('direct_chat', 1)
        ->whereHas('users', function ($query) {
            $query->where('id', '=', Auth::id());
        })
        ->get()
);

【问题讨论】:

  • 你想通过messages.created_at订购chats吗?
  • 我猜你需要加入才能使用相关表的属性对结果进行排序
  • @JonasStaudenmeir 是的
  • 一个chat可以有多个messages。你想用哪一个来订购?最新的?
  • @JonasStaudenmeir 是的,聊天可以有很多消息,但我只想显示最新消息,目前 m 使用消息表中的 take(1),但不是最新消息。

标签: eloquent eager-loading laravel-5.6


【解决方案1】:

将 JOIN 与子查询结合起来:

$chats = Chat::select('chats.*')
    ->join('messages', 'messages.chat_id', 'chats.id')
    ->where('chats.direct_chat', 1)
    ->where('messages.id', function ($query) {
        $query->select('id')
            ->from('messages')
            ->whereColumn('chat_id', 'chats.id')
            ->latest()
            ->limit(1);
    })
    ->whereHas('users', function ($query) {
        $query->where('id', '=', Auth::id());
    })
    ->latest('messages.created_at')
    ->with(['messages.users', 'users' => function ($query) {
        $query->where('id', '!=', Auth::id());
    }])
    ->get();

请注意,此查询仅选择包含至少一条消息的聊天。

【讨论】:

  • 非常感谢 Jonas,我一定会试一试,然后回到这里。
  • 不幸的是,它显示了与聊天相关的所有消息(不是最新消息)。
  • 我已经通过在聊天模型中使用 order by 来修复它
  • 你的意思是急切加载的消息吗?您可以发布更改吗?
猜你喜欢
  • 2014-12-28
  • 1970-01-01
  • 2015-05-29
  • 2015-08-16
  • 2015-11-17
  • 1970-01-01
  • 2014-08-13
  • 2021-04-23
相关资源
最近更新 更多