【问题标题】:Get last record on GROUP BY using Laravel & MySql使用 Laravel 和 MySql 获取 GROUP BY 的最后一条记录
【发布时间】:2021-11-27 19:57:17
【问题描述】:

我有两个表(usersmessages).. 我写了一个查询来获取用户发送给我或我发送的所有消息,使用 JOIN .. 获取我联系过或他们联系过的所有用户.

如下代码所示:

$users = Message::join('users',  function ($join) {
            $join->on('messages.sender_id', '=', 'users.id')
                ->orOn('messages.receiver_id', '=', 'users.id');
        })
        ->where(function ($q) {
            $q->where('messages.sender_id', Auth::user()->id)
            ->orWhere('messages.receiver_id', Auth::user()->id);
        })
        ->orderBy('messages.created', 'desc')
        ->groupBy('users.id')
        ->paginate();

这里的问题是当记录分组时,我得到的是旧消息而不是新消息,根据它的created_at ..所以,我想得到分组记录的最后一条记录。

【问题讨论】:

  • 可以修改选中的字段添加MAX(created_at)吗?
  • @DaveS 在哪里?你能解释一下吗?
  • ->select('users.id','messages.body','messages.created_at',DB::raw('MAX(messages.created_at) max_created_at')) 像这样?我做到了,但只是它为没有收到消息的响应添加了另一列
  • 您是否在Message 模型上设置了发送者和接收者关系?另外,专栏肯定是created 而不是created_at
  • 以下是否回答了您的问题或您仍有问题?

标签: php mysql laravel


【解决方案1】:

似乎在这里使用 Eloquent 的关系更有意义,这样您就可以eager load 关系,而不必使用joingroup by

$messages = Message::with('sender', 'receiver')
    ->where(function ($query) {
        $query->where('sender_id', auth()->id())
            ->orWhere('receiver_id', auth()->id())
    })
    ->orderByDesc('created') // is this meant to be 'created_at'?
    ->paginate();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 2020-12-19
    • 2012-02-13
    相关资源
    最近更新 更多