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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/33615462/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 12:39:51  来源:igfitidea点击:

Laravel: whereHas->WhereHas->Where query. Need to add wherePivot

laravellaravel-4eloquent

提问by Phil

I am selecting all the ScheduledProgramsfrom a certain data range that has Attendeesthat belong to a certain User. I want to add a filter to select only the SchduledProgramswhere the pivot field registered=1

我正在ScheduledPrograms从某个数据范围中选择所有Attendees属于某个User. 我想添加一个过滤器来只选择SchduledPrograms数据透视字段的位置registered=1

I.E. I need to add a wherePivot('registered', 1)for the many-to-many relation scheduledPrograms->attendees. I How do I do this? My mind is scrambled from all the where clauses.

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();

Models

楷模

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

User->hasMany('Attendee')

ScheduledProgram->belongsToMany('Attendee')

` ScheduledProgram Model

` 预定程序模型

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

回答by Salvis Blūzma

wherePivot()can be used only for belongsToManyinstances, but whereHas()closure function receives Builderinstance instead.

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

So you can't use wherePivot()inside whereHas().

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

回答by slashsbin

Method wherePivotworks with model instances, not with the Model Query Builder.

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

I think when using whereHasmethod, the pivot table is already joined by eloquent, so just start using itin the whereHasmethod:

我觉得在使用whereHasmethod的时候,pivot table已经被eloquent加入了,所以whereHasmethod中开始使用吧

$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();

回答by Eduardo Pacios

did you try anything? What error do you get?

你尝试过什么吗?你得到什么错误?

If the 'registered' field is in the pivot table between ScheduledPrograms and Atendees relation, you can add the where clause before the get():

如果“已注册”字段位于 ScheduledPrograms 和 Atendees 关系之间的数据透视表中,则可以在 get() 之前添加 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);
              });
           })
           ->wherePivot('registered', 1)
           ->get();