简体   繁体   English

Laravel orderBy和groupBy与if语句

[英]Laravel orderBy and groupBy with if statement

I try to retrieve the message groups from the database and The query is not ordering the results by created_at flag. 我尝试从数据库中检索消息组,并且查询未按created_at标志对结果进行排序。

The query looks like this: 查询如下所示:

$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();

Where $user_id is the authenticated user. 其中$user_id是已认证的用户。 The orderBy clause is not working as expected. orderBy子句无法按预期工作。 The users are not grouped by the last who sent a message. 用户没有按发送消息的最后一个分组。

Any suggestions? 有什么建议么? Thank you. 谢谢。

You could use Max to get the latest created_at for each message. 您可以使用Max来为每条消息获取最新的created_at The query may be like: 查询可能像:

$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();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM