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

时间:2015-11-09 18:11:53

标签: laravel laravel-4 eloquent

我从某个属于某个ScheduledPrograms Attendees的数据范围中选择了所有User。我想添加一个过滤器,仅选择枢轴字段SchduledPrograms

所在的registered=1

即。我需要为多对多关系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();

模型

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

User->hasMany('Attendee')

ScheduledProgram->belongsToMany('Attendee')

` 预定程序模型

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

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:4)

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

因此,您无法在wherePivot()内使用whereHas()

答案 2 :(得分:0)

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

如果'registered'字段位于ScheduledPrograms和Atendees关系之间的数据透视表中,您可以在get()之前添加where子句:

#include "stdafx.h"
#include <functional>
#include <chrono>
#include <iostream>


struct Struct
{
    virtual void doit() const = 0;
};

struct StructA : public Struct
{
    void doit() const { std::cout << "A" << std::endl; }
};

struct StructB : public Struct
{
    void doit() const { std::cout << "B" << std::endl; }
};

struct StructC : public Struct
{
    void doit() const { std::cout << "C" << std::endl; }
};

template <typename Type>
struct Accepter
{
    void accept(const Type& t) const { t.doit(); } ;
};

template <typename... Types>
struct MultiAccepter;

template <typename T0, typename...Types>
struct MultiAccepter<T0, Types...> : public Accepter<T0>, public MultiAccepter<Types...> {
    using Accepter<T0>::accept;
    using MultiAccepter<Types...>::accept;
};

template <typename T0>
struct MultiAccepter<T0> : public Accepter<T0> {
    using Accepter<T0>::accept;
};

int main()
{
    StructA struct_a;
    StructB struct_b;

    Accepter<StructA>                           accept_a;
    Accepter<StructB>                           accept_b;
    MultiAccepter<StructA>                      accept_multi_a;
    MultiAccepter<StructB>                      accept_multi_b;
    MultiAccepter<StructA, StructB>             accept_multi_ab;

    accept_a.accept(struct_a);              
    accept_b.accept(struct_b);             
    accept_multi_a.accept(struct_a);       
    accept_multi_b.accept(struct_b);     
    accept_multi_ab.accept(struct_a);    
    accept_multi_ab.accept(struct_b);     
    return 0;
}