Laravel:whereHas-> WhereHas-> Where查询。需要添加wherePivot

Phi*_*hil 4 laravel eloquent laravel-4

我选择全部ScheduledPrograms从具有一定范围内的数据Attendees属于某User。我想添加一个过滤器以仅选择SchduledPrograms枢纽字段registered=1

IE浏览器,我需要为wherePivot('registered', 1)多对多关系添加一个scheduledPrograms->attendees。我该怎么做?我的头脑被所有where子句打乱了。

$programs = ScheduledProgram::where('registration_start_date', '<=', $today)
              ->where('end_date', '>=',  $today)
              ->whereHas('attendees', function($q) use($user)
              {
                  $q->whereHas('user', function($q) use($user){
                      $q->where('id', $user->id);
                  });
               })->get();
Run Code Online (Sandbox Code Playgroud)

楷模

Attendee->belongsTo('User')   
        ->belongsToMany('ScheduledPrograms')

User->hasMany('Attendee')

ScheduledProgram->belongsToMany('Attendee')
Run Code Online (Sandbox Code Playgroud)

` ScheduledProgram模型

  public function attendees()
  {
    return $this->belongsToMany('Attendee', 'prog_bookings')->withPivot('registered','paid');
  }
Run Code Online (Sandbox Code Playgroud)

小智 6

wherePivot()只能用于belongsToMany实例,但是whereHas()闭包函数Builder改为接收实例。

所以你不能使用wherePivot()inside whereHas()


sla*_*bin 5

方法wherePivot适用于模型实例,不适用于模型查询生成器。

我认为在使用whereHas方法时,数据透视表已经被雄辩地连接了起来,因此只需whereHas方法中使用它即可

$programs = ScheduledProgram::where('registration_start_date', '<=', $today)
          ->where('end_date', '>=',  $today)
          ->whereHas('attendees', function($q) use($user)
          {
              $q
                  //========= See this: =========
                  ->where('prog_bookings.registered', '1')
                  ->whereHas('user', function($q) use($user){
                      $q->where('id', $user->id);
                  });
           })
           ->wherePivot('registered', 1)
           ->get();
Run Code Online (Sandbox Code Playgroud)