繁体   English   中英

在 Laravel 5.4 中使用 whereDoesntHave()

[英]Working with whereDoesntHave() in Laravel 5.4

我如何实现用户将在特定级别领取奖励的范围,一旦他们领取奖励,奖励字段将不再显示他们领取的奖励。 例如:

用户在20级,在他的奖励面板上,有3个可领取的奖励,10级,15级和20级。所以如果用户领取了10级奖励,除了15级外,面板上不再显示和20个奖励。

这是刀片的代码:

 @foreach(App\LevelRewards::getRewards()->get() as $rewards)
 @if(Auth::user()->level >= $rewards->level_required || Auth::user()->level == $rewards->level_required)
    @if(App\ClaimReward::claimLevel()->get())
            <div class="col-lg-2 col-md-3 col-sm-6 col-xs-6" style="margin: 5px 0px;">
               <div class="hovereffect">
                    <a href="#" class="d-block mb-4 h-100">
                   <input type ="hidden" name="id" value="{{$rewards->id}}"/>
                   <img class="img-responsive" src="{{asset('rewards_img/'.$rewards->picture)}}" alt="">
                    </a>
                <div class="overlay">
                 <h2 style="font-size: 14px;">{{$rewards->details}}</h2>
                 @if($rewards->type == 'physical')
                 <button type="button" class="btn btn-success btn-sm" data-toggle="modal" data-target="#claimPhysical" data-details="{{$rewards->details}}" data-id="{{$rewards->id}}" data-level="{{$rewards->level_required}}" data-physical="{{$rewards->item_name}}">
                CLAIM
                </button>
                @else
                <button type="button" class="btn btn-success btn-sm" data-toggle="modal" data-target="#claimDigital" data-id="{{$rewards->id}}" data-level="{{$rewards->level_required}}" data-physical="{{$rewards->item_name}}">
                CLAIM
                </button>
                @endif
      </div>
    <div style="background: #2d2d2d; padding: 9px;">
         <span class="credits_top">Required Level: <span>{{$rewards->level_required}}</span></span>
         <p>{{$rewards->item_name}}</p> 
    </div> 
</div>                                                                  
   @endif
  @endif
@endforeach

这是模型 ClaimReward 模型的代码:

public function scopeClaimLevel2($query)
{
    return $query->join('level_rewards','level_rewards.id','=','claim_rewards.reward_id')->select('level_rewards.*');
}

非常感谢有关此问题的任何链接和信息来源。 谢谢你。

编辑:我试过了;

public function scopeClaimLevel($query)
{
    return $query->join('claim_rewards','claim_rewards.reward_id','=','level_rewards.id')->select('level_rewards.*');
}
public function scopeGetRewards($query)
{
    return $query
    ->join('claim_rewards','claim_rewards.reward_id','=','level_rewards.id')
    ->whereDoesntHave('claimLevel', function (Builder $query) {
           $query->where('claim_rewards.status', '=', '0');
     }) 
    ->select('level_rewards.*');
}

但它说Call to undefined method Illuminate\Database\Query\Builder::getRelated()'

添加另一个表来保存用户已经领取的奖励,

并在 foreach 中检查此用户领取的奖励中是否存在此奖励 ID,

如果不是,则显示它,如果是,则跳过它。

该表将包含 2 个字段:

1) 用户名

2)奖励_id

关于上述评论,

在你编辑你尝试过的内容之后,

看起来查询的顺序是错误的...将 whereDoesntHave 放在选择之前,

并更改为 Laravel 文档示例中所写的它的实现。

试试这个:

public function scopeClaimLevel2($query)
{
    return $query
      ->join('claim_rewards','claim_rewards.reward_id','=','level_rewards.id')
      ->whereDoesntHave('claim_rewards', function (Builder $query) {
             $query->where('status', '=', '0');
       }) 
      ->select('level_rewards.*');    

}

编辑:

尝试更改连接,如此处所写: https ://laravel.com/docs/5.4/queries#joins

构建连接并在其功能中设置如何连接以及状态=0的位置

return $query
      ->join('claim_rewards', function ($join) {
          $join->on('claim_rewards.reward_id', '=', 'level_rewards.id')->where('status', '=', '0');
      })
      ->select('level_rewards.*');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM