php - Laravel(5.6) 按最后一条消息 Eloquent 排序

标签 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);

我该怎么做?

最佳答案

您可以使用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/

相关文章:

php - 完善我的 Eloquent 查询 (Laravel)

php - 使用 PHP 连接到 mySQL,连接昨天有效,但今天不行

java - 检测 html 元素更改的最佳方法?

php - GROUP BY 计算不正确

python - 使用 python 脚本推断 excel 文件中的数据

mysql - 另一个连接表上的 SQL 连接约束列

php - 如何通过 git 推送 laravel 包和帮助文件

java - 验证 Restful API 和移动应用程序的最佳方式

php - 如果数组的大小大于 1

php - Laravel 中的 Controller 无法识别由 JQuery 创建的表单元素