查询关系是否存在,如何根据数组长度添加条件
Querying Relationship Existence, how to add conditions depending on an array length
我想通过存储在单独 table(在本例中为 tapps)中的一些特征来过滤项目(在本例中为酒吧),并且两者都通过 pub_tapps.
我有以下 table:pubs、tapps、pub_tapps(pub_id、tapp_id)
Pub和Tapp的关系如下:
public function pubTapps()
{
return $this->belongsToMany(Tapp::class, 'pub_tapps');
}
在我的 Pub 模型中,我尝试对数组 $request=[5,8, 7] 进行以下测试:
public function pubsFilteredByTapps(FilteredTappsPubsRequest $request)
{
$tapps_chosen = $request->get('tapps');
$tapps_chosen = is_string($tapps_chosen) ? explode(',', str_replace('"', '', $tapps_chosen)) : $tapps_chosen;
return Pub::whereHas('pubTapps', function($query) use($tapps_chosen) {
$query->where('tapp_id', $tapps_chosen[0]);
})
->whereHas('pubTapps', function($query) use($tapps_chosen) {
$query->where('tapp_id', $tapps_chosen[1]);
})
->whereHas('pubTapps', function($query) use($tapps_chosen) {
$query->where('tapp_id', $tapps_chosen[2]);
})
->get();
}
这工作得很好,但对于给定的 3 维数组...
对于长度为 n 的数组,我该怎么做?
我试过了,但根本不起作用(returns 一个空数组):
return $pubs = Pub::whereHas('pubTapps', function ($query) use
($tapps_chosen) {
foreach ($tapps_chosen as $tappId) {
$query->where('tapp_id', $tappId);
}
})->get();
我需要做什么???有什么想法可以让它发挥作用吗??
非常感谢!
这个怎么样?
public function pubsFilteredByTapps(FilteredTappsPubsRequest $request)
{
$tapps_chosen = $request->get('tapps');
$tapps_chosen = is_string($tapps_chosen) ? explode(',', str_replace('"', '', $tapps_chosen)) : $tapps_chosen;
return Pub::whereHas('pubTapps', function($query) use($tapps_chosen) {
$query->whereIn('tapp_id', explode(',' $tapps_chosen));
})->get();
}
这样,如果数组中有任意数量的 ID,eloquent 将生成带有 IN 子句的请求,您将获得正确的结果。
使用这个:
$query = Pub::query();
foreach ($tapps_chosen as $tappId) {
$query->whereHas('pubTapps', function($query) use($tappId) {
$query->where('tapp_id', $tappId);
});
}
return $query->get();
我想通过存储在单独 table(在本例中为 tapps)中的一些特征来过滤项目(在本例中为酒吧),并且两者都通过 pub_tapps.
我有以下 table:pubs、tapps、pub_tapps(pub_id、tapp_id)
Pub和Tapp的关系如下:
public function pubTapps()
{
return $this->belongsToMany(Tapp::class, 'pub_tapps');
}
在我的 Pub 模型中,我尝试对数组 $request=[5,8, 7] 进行以下测试:
public function pubsFilteredByTapps(FilteredTappsPubsRequest $request)
{
$tapps_chosen = $request->get('tapps');
$tapps_chosen = is_string($tapps_chosen) ? explode(',', str_replace('"', '', $tapps_chosen)) : $tapps_chosen;
return Pub::whereHas('pubTapps', function($query) use($tapps_chosen) {
$query->where('tapp_id', $tapps_chosen[0]);
})
->whereHas('pubTapps', function($query) use($tapps_chosen) {
$query->where('tapp_id', $tapps_chosen[1]);
})
->whereHas('pubTapps', function($query) use($tapps_chosen) {
$query->where('tapp_id', $tapps_chosen[2]);
})
->get();
}
这工作得很好,但对于给定的 3 维数组...
对于长度为 n 的数组,我该怎么做?
我试过了,但根本不起作用(returns 一个空数组):
return $pubs = Pub::whereHas('pubTapps', function ($query) use
($tapps_chosen) {
foreach ($tapps_chosen as $tappId) {
$query->where('tapp_id', $tappId);
}
})->get();
我需要做什么???有什么想法可以让它发挥作用吗??
非常感谢!
这个怎么样?
public function pubsFilteredByTapps(FilteredTappsPubsRequest $request)
{
$tapps_chosen = $request->get('tapps');
$tapps_chosen = is_string($tapps_chosen) ? explode(',', str_replace('"', '', $tapps_chosen)) : $tapps_chosen;
return Pub::whereHas('pubTapps', function($query) use($tapps_chosen) {
$query->whereIn('tapp_id', explode(',' $tapps_chosen));
})->get();
}
这样,如果数组中有任意数量的 ID,eloquent 将生成带有 IN 子句的请求,您将获得正确的结果。
使用这个:
$query = Pub::query();
foreach ($tapps_chosen as $tappId) {
$query->whereHas('pubTapps', function($query) use($tappId) {
$query->where('tapp_id', $tappId);
});
}
return $query->get();