查询“ with”内的模型

时间:2019-02-01 04:10:52

标签: laravel eloquent

我正在Laravel中制作聊天API。我有三种模式。 User ChatMessage,它们有各自的表。

用户表

id|name|email|other fields

聊天表

id|user_id|receiver_id

消息表

id|chat_id|message|created_at|updated_at|

结果是:

{
    "data": [
        {
            "id": 7,
            "chat_id": 5,
            "message": "User 2 to 1",
            "created_at": "2019-02-01 11:32:29",
            "updated_at": "2019-02-01 11:32:29",
            "chat": null
        },
        {
            "id": 6,
            "chat_id": 1,
            "message": "Sample Chat",
            "created_at": "2019-02-01 10:09:22",
            "updated_at": "2019-02-01 10:09:22",
            "chat": {
                "id": 1,
                "user_id": 1,
                "receiver_id": 1,
                "created_at": "2019-02-01 09:41:59",
                "updated_at": "2019-02-01 10:09:22"
            }
        },
        {
            "id": 2,
            "chat_id": 1,
            "message": "Sample Chat",
            "created_at": "2019-02-01 09:42:34",
            "updated_at": "2019-02-01 09:42:34",
            "chat": {
                "id": 1,
                "user_id": 1,
                "receiver_id": 1,
                "created_at": "2019-02-01 09:41:59",
                "updated_at": "2019-02-01 10:09:22"
            }
        },
        {
            "id": 1,
            "chat_id": 1,
            "message": "Sample Chat",
            "created_at": "2019-02-01 09:41:59",
            "updated_at": "2019-02-01 09:41:59",
            "chat": {
                "id": 1,
                "user_id": 1,
                "receiver_id": 1,
                "created_at": "2019-02-01 09:41:59",
                "updated_at": "2019-02-01 10:09:22"
            }
        }
    ]
}

我尝试过

$messages = Message::with(['chat' => function($query) use($user){
                        $query->where('user_id', $user->id);
                    }])
                    ->latest()
                    ->get();

您会看到第一个数据聊天模型为空。

我希望只能从聊天模型中获取所有与用户ID相关的消息。

1 个答案:

答案 0 :(得分:0)

在查询中使用whereHas将仅给出聊天属于虚拟用户的信息。

$messages = Message::with(['chat'])->whereHas('chat', function ($query) {
                     $query->where('user_id', $user->id);
                })
                ->latest()
                ->get();