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

时间:2019-04-17 04:52:34

标签: php laravel-5.4

我已经为此工作了一个星期,我想做的是,选择用户未要求的等级奖励,但是我收到一条错误消息:调用undefined method::getRelated()

claim_rewards表由

组成
id, reward_id, user_id, status

因此,如果用户有3个要声明的奖励,而该用户要求一个奖励,则字段中仅应显示剩余的两个奖励,因此我认为应该执行“ whereDoesNotHave”子句,但我可以这样做t弄清楚如何执行代码以使其正常工作。

这是两个范围的代码:

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表的结构

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_rewards表的约束关系

因此,如果我将其放入场景中,将是结果:

我(作为用户的等级为20)。我有3个奖励要求。现在,对于我的奖励列表,我有10、15和20级奖励可以申请。 现在,我要求获得15级和20级奖励之外的10级奖励。因此,在我的Claim_rewards表中将包含来自level_rewards表的已声明数据。这将是Claim_rewards表的reward_id。

因此,如果要求的10级奖励的状态为零,那么它将不再显示在该字段中。剩余要显示的奖励是level_rewards表中的那些在Claim_rewards表中状态不为零的奖励

2 个答案:

答案 0 :(得分:0)

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

更新

在仔细检查了代码之后,我意识到您正在将whereDoesntHave与查询范围一起使用,但是它只能与关系一起使用。我建议您重构查询。

答案 1 :(得分:0)

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

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

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