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
Laravel: whereHas->WhereHas->Where query. Need to add wherePivot
提问by Phil
I am selecting all the ScheduledPrograms
from a certain data range that has Attendees
that belong to a certain User
. I want to add a filter to select only the SchduledPrograms
where 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 belongsToMany
instances, but whereHas()
closure function receives Builder
instance instead.
wherePivot()
只能用于belongsToMany
实例,但whereHas()
闭包函数接收Builder
实例。
So you can't use wherePivot()
inside whereHas()
.
所以你不能使用wherePivot()
inside whereHas()
。
回答by slashsbin
Method wherePivot
works with model instances, not with the Model Query Builder.
方法wherePivot
适用于模型实例,而不适用于模型查询生成器。
I think when using whereHas
method, the pivot table is already joined by eloquent, so just start using itin the whereHas
method:
我觉得在使用whereHas
method的时候,pivot table已经被eloquent加入了,所以就在whereHas
method中开始使用吧:
$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();