我已经在这方面工作了一个星期,我想要发生的是,选择未被用户声明的级别奖励,但我收到一个错误,上面写着:调用未定义的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表中没有状态为零的奖励
我怀疑你在查询范围中使用Illuminate\Database\Query\Builder
,但你应该使用Illuminate\Database\Eloquent\Builder
。
UPDATE
在仔细检查了您的代码之后,我意识到您正在使用带有查询范围的whereDoesntHave
,但它只能用于关系。我建议你重构你的查询。
我通过添加方法解决了这个问题,但我只有一个小问题,我不能为claim_reward.status添加另一个whereDoesntHave子句:
public function rewards()
{
return $this->hasMany('App\ClaimReward','reward_id');
}
public function scopeNotClaimed($query)
{
return $query->whereDoesntHave('rewards');
}