我有一个 User
模型,它引用了 MessageParticipant
模型(返回用户参与的所有消息主题)
public function messages()
{
return $this->hasMany(MessageParticipant::class);
}
MessageParticipant
引用 MessageSubject
模型(返回参与者所属的消息主题)
public function message_subject()
{
return $this->belongsTo(MessageSubject::class);
}
MessageSubject
模型引用 Message
模型(返回消息主题内的所有消息)
public function messages()
{
return $this->hasMany(Message::class);
}
我想返回用户正在参与的所有消息主题,并根据消息主题的最新消息条目进行排序。 以下是我到目前为止所尝试过的。
$messages = $user->messages()->search($search)
->join('messages', 'messages.message_subject_id', '=', 'message_subject.id')
->select('message_subject.*', 'messages.created_at AS latest_message_at')
->orderByDesc('latest_message_at')
->paginate(30);
我该怎么做?
最佳答案
您可以使用BelongsToMany
关系直接获取消息主题:
class User extends Model {
public function messageSubjects() {
return $this->belongsToMany(MessageSubject::class, 'message_participants');
}
}
然后将其与修改后的 withCount()
一起使用以获取最新消息:
$messages = $user->messageSubjects()
->withCount(['messages as latest_message' => function($query) {
$query->select(DB::raw('max(messages.created_at)'));
}])
->search($search)
->orderByDesc('latest_message')
->paginate(30);
关于php - Laravel(5.6) 按最后一条消息 Eloquent 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51812660/