TL; DR: требуется последнее сообщение от каждого отправителя.
В моем приложении Laravel у меня есть две таблицы:
Пользователи
- ID
- имя
Сообщения:
- ID
- 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
Затем пользователь с идентификатором 1 (recipient_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 просто не достаточно, и после нескольких дней попыток у меня нет решения.
Спасибо.