我已经做了一个星期了,我想要做的是,选择用户没有声明的级别奖励,但是我得到了一个错误:调用未定义的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表的数据。它将是reward_id表的claim_rewards。
因此,如果声称的10级奖励的状态为零,那么它将不再显示在字段中。要显示的其余奖励是,来自level_rewards表的那些在claim_rewards表中没有零状态的奖励
发布于 2019-04-17 07:47:40
我通过添加一个方法解决了这个问题,但是我只有一个小问题,我不能为claim_reward.status添加另一个claim_reward.status子句:
public function rewards()
{
return $this->hasMany('App\ClaimReward','reward_id');
}
public function scopeNotClaimed($query)
{
return $query->whereDoesntHave('rewards');
}发布于 2019-04-17 05:11:04
我怀疑您在查询范围中使用Illuminate\Database\Query\Builder,但应该使用Illuminate\Database\Eloquent\Builder。
更新
在仔细检查了您的代码之后,我意识到您使用的是带有查询范围的whereDoesntHave,但它只能用于关系。我建议你重构你的查询。
https://stackoverflow.com/questions/55720136
复制相似问题