Laravel 8 - 限制连接表

Laravel 8 - Limit joined tables

所以我的数据结构如下:

User

Collection

Game

在我的模型中,我有这样的关系:

User::hasMany(Collection)
Collection::belongsTo(Game)
Game::hasMany(Collection)

所以我想做的是获取用户列表并通过集合 table 包含所有相关游戏。但我只想包括那些具有特定状态的游戏。我正在使用的代码(不起作用)如下:

User::with('collections.game')->whereHas('collections.game', function ($query) {
    return $query->where('status', '<>', 'denied');
})->get()

我的问题是所有游戏记录都被返回,包括状态为 denied 的记录。我正在四处阅读,上面的内容似乎应该有效,但事实并非如此。

我做错了什么?

你做不到whereHas('collections.game', ...)。你必须做一个 whereHas of a whereHas:

User::with('collections.game')
    ->whereHas('collections', function (Builder $query) {
        return $query->whereHas('game', function (Builder $query) {
            return $query->where('status', '<>', 'denied');
        })
    })
    ->get()

我相信您需要对 with() 子句进行筛选,因为 whereHas() 将仅筛选用户数据,但急切加载的关系不会自动包含该筛选器。

User::with(['collections.game' => function ($query) {
        return $query->where('status', '<>', 'denied');
    }])
    ->whereHas('collections.game', function ($query) {
        return $query->where('status', '<>', 'denied');
    })->get()