我已经为此工作了一个星期,我想做的是,选择用户未要求的等级奖励,但是我收到一条错误消息:调用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表中状态不为零的奖励
答案 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');
}