Laravel(5.6)按最后一条消息雄辩地排序

时间:2018-08-12 20:39:02

标签: php mysql laravel eloquent

我有一个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);

我该怎么办?

1 个答案:

答案 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);