Laravel 5.4: 调用未定义的方法 Illuminate/Database/Query/Builder::getRelated()

Laravel 5.4: Call to undefined method Illuminate/Database/Query/Builder::getRelated()

我已经为此工作了一个星期了,我想要发生的是 select 用户尚未领取的等级奖励,但我收到错误消息其中说:调用 undefined method::getRelated().

claim_rewards table 包含

id, reward_id, user_id, status

所以,如果一个用户有 3 个奖励要领取,而用户领取了一个奖励,那么字段上应该只显示剩余的两个奖励,所以我认为 'whereDoesNotHave' 子句应该可以解决,但我不知道如何实现代码以使其工作。

这是两个作用域的代码:

public function scopeClaimLevel($query)
{
    return $query->join('claim_rewards','claim_rewards.reward_id','=','level_rewards.id')->select('level_rewards.*');
}

public function scopeRewards($query)
{
   return $query = LevelRewards::whereDoesntHave('claimLevel')->whereDoesntHave('claim_rewards.status','=','0')->get();
}

我什至试过这个:

public function scopeGetRewards($query)
{
    return $query->claimLevel()
    ->whereDoesntHave('claimLevel', function (Builder $query) {
           $query->where('claim_rewards.status', '=', '0');
     }) 
    ->select('level_rewards.*')->get();
}

我什至将其包含在 LevelRewards 模型中:

use App\ClaimReward;

但我仍然得到同样的错误。关于如何处理这个的任何想法?谢谢。

编辑:

这是 level_rewards table

的结构
id, level_required, item_name

这就是为什么我将范围纳入 LevelRewards 模型的原因

public function scopeClaimLevel($query)
{
    return $query->join('claim_rewards','claim_rewards.reward_id','=','level_rewards.id')->select('level_rewards.*');
}

这样会导致对claim_rewardstable

的约束关系

所以如果我把它放到一个场景中,这将是结果:

我,作为一个20级的用户,我有3个奖励可以领取。现在,对于我的奖励列表,我有 10、15 和 20 级奖励可供领取。 现在,我领取了除15级和20级奖励外的10级奖励。因此,在我的 claim_rewards table 中将包含来自 level_rewards table 的数据。这将是 reward_id 的 claim_rewards table.

因此,如果领取的10级奖励的状态为零,则该字段将不再显示。剩余显示的奖励是来自level_rewardstable的那些在claim_rewardstable

中状态不为零的奖励

我怀疑您在查询范围内使用 Illuminate\Database\Query\Builder,但您应该改用 Illuminate\Database\Eloquent\Builder.

更新

仔细检查您的代码后,我意识到您使用的是带有查询范围的 whereDoesntHave,但它只能用于关系。我建议您重构您的查询。

我已经通过添加一个方法解决了这个问题,但我只有一个小问题,我无法为 claim_reward.status 添加另一个 whereDoesntHave 子句:

public function rewards()
{
    return $this->hasMany('App\ClaimReward','reward_id');
}

public function scopeNotClaimed($query)
{
    return $query->whereDoesntHave('rewards');
}