我有一个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);
我该怎么办?
答案 0 :(得分:2)
您可以使用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);