排序依据在分组之前 使用雄辩(Laravel)

2022-08-30 23:51:41

我有一个包含以下列的“消息”表

CREATE TABLE `messages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fromId` int(11) NOT NULL,
  `toId` int(11) NOT NULL,
  `message` text NOT NULL,
  `status` int(11) NOT NULL,
  `device` varchar(100) NOT NULL,
  `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=57 DEFAULT CHARSET=latin1;

我正在尝试获取“toId”=$id的所有消息,并按fromId分组。问题在于,结果上显示的“消息”是第一个,而不是最新的。我尝试按 createdAt 订购,但它不起作用。

在查询和分组结果之前,如何按“createdAt”进行排序?我想用Eloquent以laravel的方式做到这一点。

我的查询:

$chats = Message::with('sender','recipient')
        ->where('toId',$id)
        ->orderBy('createdAt')
        ->groupBy('fromId')
        ->paginate(10)

答案 1

我只需要对消息模型做类似的事情。对我有用的是将该方法应用于返回的雄辩集合。unique

Model::where('toId', $id)
    ->orderBy('createdAt', 'desc')
    ->get()
    ->unique('fromId');

查询将返回按 排序的所有消息,并且该方法会将其减少到每个 消息一条消息。这显然不如直接使用数据库那样有效,但在我的情况下,我对查询有进一步的限制。createdAtuniquefromId

此外,还有许多更有用的方法来使用这些集合:https://laravel.com/docs/5.2/collections#available-methods


答案 2

我找到了一种方法来做到这一点!基本上,创建一个子查询并在之前运行它,以便按预期对结果进行排序并在之后分组。

代码如下:

$sub = Message::orderBy('createdAt','DESC');

$chats = DB::table(DB::raw("({$sub->toSql()}) as sub"))
    ->where('toId',$id)
    ->groupBy('fromId')
    ->get();

推荐