Laravel orderBy和groupBy with if statement

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel orderBy和groupBy with if statement相关的知识,希望对你有一定的参考价值。

我尝试从数据库中检索消息组,并且查询没有通过created_at标志对结果进行排序。

查询如下所示:

$groups = self::
    where(function($query) use ($user_id) {
        $query->where('to_id', $user_id);
        $query->orWhere('from_id', $user_id);
    })
    ->join('users as u1', 'user_messages.to_id', 'u1.id')
    ->join('users as u2', 'user_messages.from_id', 'u2.id')
    ->select(
        'u1.nickname as u1_nickname',
        'u1.id as u1_id',
        'u2.id as u2_id',
        'u2.nickname as u2_nickname',
        'user_messages.created_at'
    )
    ->orderBy('created_at', 'desc')
    ->groupBy(
        DB::raw(
            'if (user_messages.from_id = '.$user_id.', user_messages.to_id, user_messages.from_id)'
        )
    )
    ->get()
    ->toArray();

其中$user_id是经过身份验证的用户。 orderBy子句未按预期工作。用户未按发送邮件的最后一个人分组。

有什么建议?谢谢。

答案

您可以使用Max为每条消息获取最新的created_at。查询可能如下:

$groups = self::
where(function($query) use ($user_id) {
    $query->where('to_id', $user_id);
    $query->orWhere('from_id', $user_id);
  })
->join('users as u1', 'user_messages.to_id', 'u1.id')
->join('users as u2', 'user_messages.from_id', 'u2.id')
->selectRaw(
    'u1.nickname as u1_nickname,
     u1.id as u1_id,
     u2.id as u2_id,
     u2.nickname as u2_nickname,
     max(user_messages.created_at) as created_at'
  )
->orderBy('created_at', 'desc')
->groupBy(
    DB::raw(
        'if (user_messages.from_id = '.$user_id.', user_messages.to_id, user_messages.from_id)'
        )
  )
->get()
->toArray();

以上是关于Laravel orderBy和groupBy with if statement的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 中的 GroupBy 之前使用 Orderby

在 Laravel 中进行复杂查询的 orderBy 之后的 GroupBy

Laravel Eloquent groupBy orderBy 在 MariaDB 中给出不同的结果

Laravel groupBy 不能与 PostgreSQL 一起正常工作

where也是和groupby一样显示符合条件的记录在group中所有字段?

GroupBy 之前的 JAVAX 持久性 OrderBy