我从某个属于某个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');
}
答案 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;
}