【问题标题】:Laravel orderBy and groupBy with if statementLaravel orderBy 和 groupBy 与 if 语句
【发布时间】:2018-04-02 08:12:44
【问题描述】:

我尝试从数据库中检索消息组,但查询未按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 子句未按预期工作。用户不按最后发送消息的人分组。

有什么建议吗?谢谢。

【问题讨论】:

  • groupBy()之后尝试orderBy()
  • 谢谢,但没有用。
  • dd(groups) 提供了什么?
  • 能否请您添加您的表结构、一些示例数据和预期结果?

标签: php mysql laravel eloquent laravel-eloquent


【解决方案1】:

您可以使用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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2014-10-16
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    相关资源
    最近更新 更多