【问题标题】:Dynamic Property call giving error (Property [game] does not exist on the Eloquent builder instance.)动态属性调用给出错误(属性 [game] 在 Eloquent 构建器实例上不存在。)
【发布时间】:2019-08-17 23:13:21
【问题描述】:

我有两个模型:Game 和 Game_Assignment。 Game_Assignment 告诉谁是玩游戏的人。

我正在尝试计算用户拥有其 ID 的 Game_Assignment 的数量,该数量在与之相关的游戏模型上也具有特定值。我将进入模型/代码

游戏模型关系:

public function assignments() {
  return $this->hasMany('App\Models\Game_Assignment', 'game_id');
}

Game_Assignment 关系:

public function game() {
  return $this->belongsTo('App\Models\Game', 'game_id');
}

哪里出了问题(在队列作业中,如果有影响的话)

$gamesDue = Game_Assignment::where('statistician_id', $statistician->id)->game->where('stats_done', '!=', 'yes')->count();

我也尝试了以下两件事,都没有成功:

$gamesDue = Game_Assignment::where('statistician_id', $statistician->id)->game()->where('stats_done', '!=', 'yes')->count();

还有……

$gamesDue = Game_Assignment::where('statistician_id', $defaultStatistician->id)->with(['games' => function($query) {
        $query->where('stats_done', '!=', 'yes');
      }])->count();

这些都不起作用,我展示的第一个抛出了错误:

Property [game] does not exist on the Eloquent builder instance.

有人知道我哪里出错了吗?我使用这个链接作为我的参考https://laravel.com/docs/5.8/eloquent-relationships#eager-loading

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    使用Game_Assignment 模型的查询构建器时,您不能简单地将上下文切换到Game 的查询构建器。您只能在使用first()get() 检索到Game_Assignment 的一个或多个模型实例之后调用->game()->game

    因此,在您的特定情况下,您正在寻找 whereHas('game', $callback)(其中 $callback 是一个对外部表应用约束的函数)以便在外部表上添加约束:

    use Illuminate\Database\Eloquent\Builder;
    
    $gamesDue = Game_Assignment::query()
        ->where('statistician_id', $statistician->id)
        ->whereHas('game', function (Builder $query) {
            $query->where('stats_done', '!=', 'yes');
        })
        ->count();
    

    旁注:似乎包含布尔值 (yes/no) 的列 (stats_done) 应该是布尔类型,而不是字符串/varchar。

    【讨论】:

    • 我遵循你所说的逻辑,但是当我使用你的代码时它返回 0,即使我可以在数据库中清楚地看到它不应该是 0
    • 也许可以用文字解释你到底想要什么。从我怀疑的查询中:我想获取尚未完成游戏统计的特定用户的游戏分配数量。
    • 没错。我假设既然你放了 count() 你就知道我想返回计数,而不是对象。如果有帮助,我可以尝试向您展示我正在编写的代码周围的内容,并尝试解释这些内容,看看是否可能是这件事搞砸了?
    • 抱歉,您当然是在找伯爵。虽然并没有真正改变任何东西。 game_assignments 表中是否还有 stats_done 列?
    • 不,我在网上其他地方看到过,但遗憾的是,这不是问题所在。 game_assignments 只有几个相关的 ID
    猜你喜欢
    • 2021-01-06
    • 2022-01-15
    • 2020-08-02
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多