【问题标题】:Laravel 5.4: Call to undefined method Illuminate/Database/Query/Builder::getRelated()Laravel 5.4:调用未定义的方法 Illuminate/Database/Query/Builder::getRelated()
【发布时间】:2019-04-17 04:52:33
【问题描述】:

我已经为此工作了一周,我想要发生的是,选择用户尚未领取的级别奖励,但我收到一条错误消息:调用未定义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。我有三个奖励要领取。现在,对于我的奖励列表,我有 10、15 和 20 级的奖励可以领取。 现在,我领取了 15 级和 20 级奖励之外的 10 级奖励。所以在我的 claim_rewards 表中将有一个来自 level_rewards 表的数据。这将是claim_rewards 表的reward_id。

因此,如果领取的 10 级奖励的状态为零,则它将不再显示在该字段中。剩余要显示的奖励是 level_rewards 表中在 claim_rewards 表中状态不为零的奖励

【问题讨论】:

    标签: php laravel-5.4


    【解决方案1】:

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

    更新

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

    【讨论】:

    • 先生,我该怎么做?我确实使用了 Illuminate\Database\Eloquent\Builder 和 Illuminate\Database\Eloquent\Model 但同样的事情发生了
    • 你能用你的控制器代码更新问题吗?
    • 先生,我没有这个控制器,它只是为了显示刀片。那么,如果 whereDoesntHave 只能和关系一起使用,那要怎么在方法中放出来呢?
    • 我开始明白了。我只需要level_rewards的结构,我相信我可以给你答案。
    • 我在问题中添加了其他详细信息,请检查。
    【解决方案2】:

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

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

    【讨论】:

    • 按照您提出解决方案的方式,您现在可以使用回调函数作为whereDoesntHave 函数的第二个参数。
    猜你喜欢
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 2014-04-25
    相关资源
    最近更新 更多