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

问题描述 投票:0回答:2

我已经在这方面工作了一个星期,我想要发生的是,选择未被用户声明的级别奖励,但我收到一个错误,上面写着:调用未定义的method::getRelated()

claim_rewards表包含

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

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级。我有三个奖励要求。现在,对于我的奖励清单,我有10级,15级和20级奖励。现在,除了15级和20级奖励外,我还获得了10级奖励。因此,在我的claim_rewards表中,将包含来自level_rewards表的数据。这将是claim_rewards表的reward_id。

因此,如果声明的10级奖励的状态为零,则它将不再显示在该字段中。要显示的剩余奖励是来自level_rewards表的那些在claim_rewards表中没有状态为零的奖励

php laravel-5.4
2个回答
0
投票

我怀疑你在查询范围中使用Illuminate\Database\Query\Builder,但你应该使用Illuminate\Database\Eloquent\Builder

UPDATE

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


0
投票

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

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

public function scopeNotClaimed($query)
{
    return $query->whereDoesntHave('rewards');
}
© www.soinside.com 2019 - 2024. All rights reserved.