TL;DR:需要每个发件人的最新消息。
在我的 Laravel 应用程序中,我有两个表:
用户:
- 身份证
- 姓名
消息:
- 身份证
- 发件人编号
- 收件人编号
- 正文
- created_at
当然还有模型。
用户模型:
public function messages() {
return $this->hasMany('App\Message', 'recipient_id');
}
消息模型:
public function sender() {
return $this->belongsTo('App\User', 'sender_id');
}
public function recipient() {
return $this->belongsTo('App\User', 'recipient_id');
}
当用户打开他的收件箱时,他应该看到来自任何其他用户的最新邮件列表。
所以如果有消息:
id sender_id recipient_id body created_at
1, 2, 1, hi, 2016-06-20 12:00:00
2, 2, 1, hi, 2016-06-21 12:00:00
3, 3, 1, hi, 2016-06-20 12:00:00
4, 3, 1, hi, 2016-06-21 12:00:00
那么 ID 为 1 (recipient_id) 的用户应该只能看到 ID 为 2 和 4 的消息。
这是用户模型中的当前解决方案:
return Message::whereIn('id', function($query) {
$query->selectRaw('max(`id`)')
->from('messages')
->where('recipient_id', '=', $this->id)
->groupBy('sender_id');
})->select('sender_id', 'body', 'created_at')
->orderBy('created_at', 'desc')
->get();
这是行得通的,但我一直在徘徊是否有可能以 Laravel 的方式实现这一目标。可能是急切加载。我的 Laravel 技能还不够,经过几天的尝试,我没有找到解决方案。
谢谢。
最佳答案
从 this post 中汲取灵感,最有效的方法是这样的:
DB::table('messages AS m1')
->leftjoin('messages AS m2', function($join) {
$join->on('m1.sender_id', '=', 'm2.sender_id');
$join->on('m1.id', '<', 'm2.id')
})->whereNull('m2.id')
->select('m1.sender_id', 'm1.body', 'm1.created_at')
->orderBy('m1.created_at', 'm1.desc')->get();
虽然它不是 Laravel 最友好的,但它是基于性能的最佳解决方案,正如上面这个答案中链接的帖子所强调的那样
关于php - 在 Laravel 中获取每个用户的最新消息(行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38120810/