【发布时间】:2016-11-02 09:55:39
【问题描述】:
TL;DR:需要每个发件人的最新消息。
在我的 Laravel 应用程序中,我有两个表:
用户:
- 身份证
- 姓名
消息:
- 身份证
- sender_id
- recipient_id
- 身体
- 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 技能还不够,经过几天的尝试,我没有解决方案。
谢谢。
【问题讨论】:
-
我认为这个解决方案完全没问题。这个解决方案到底有什么让您烦恼的地方?
-
只是我认为在 Laravel 中有一种更正确、更干净的方法。
-
我会更关心你的函数需要多少查询以及这些查询需要多长时间。
-
简单的 \Auth::user()->messages()->orderBy('created_at', 'DESC')->first() 不起作用?
-
您正在考虑的解决方案不起作用,我认为如果 id 1 的用户回复 id 2 或 id 3,将显示的最后一条消息将是从 id 2 或id 3,那么最后它不会显示对话的最后一条消息