代码之家  ›  专栏  ›  技术社区  ›  John Carlo

左联接键约束数据已存在

  •  0
  • John Carlo  · 技术社区  · 5 年前

    这个问题是关于我如何实现一个范围,在这个范围中,用户将在特定级别上申请奖励,一旦他们申请了奖励,奖励字段将不再显示他们所申请的奖励。例如:

    用户在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
    

    这是索赔回报模型的代码:

    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.*');
    }
    

    但它说调用未定义的方法illumed\database\query\builder::getrelated()'

    1 回复  |  直到 5 年前
        1
  •  0
  •   shushu304    5 年前

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

    在foreach检查中,如果此用户申请的奖励中存在此奖励ID,

    如果不是这样的话就展示出来,如果是的话就跳过它。

    该表将包含两个字段:

    1)用户标识

    2)奖励

        2
  •  0
  •   shushu304    5 年前

    关于上述评论,

    在你对你所尝试的进行编辑之后,

    看起来查询的顺序不对…把不存在的放在选择之前,

    并更改为它的实现,如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.*');