在我的Laravel应用程序中,我正在构建过滤器功能。您可以通过选择模型A与模型B之间的关系来过滤模型A。模型A与模型B具有多对多关系。 例如,模型A1与模型B1,B2,B3有关系,模型A2与B2,B3有关系,模型A3与模型B3有关系。
如果在过滤器模型A1中仅选择B3,则应显示A2和A3。如果选择B3和B2,则仅显示A1和A2。
有没有一种方法可以解决此问题,怎么解决?我不知道我的例子是否清楚,否则请告诉我。
我通过以下操作尝试了whereHas
:
$gyms = Gym::whereHas('facilities', function (Builder $query) use ($facilities) {
$query->whereIn('id', $facilities);
})->get();
问题是,如果我希望所有具有设施1和设施2的体育馆都显示仅具有设施1或设施2的体育馆,但是我需要同时具有两者的模型。
在我的示例中,健身房是模型A,而设施是模型B。$facilities
是设施ID的数组。
答案 0 :(得分:1)
要在Laravel中使用“ where in”子句,方法是whereIn()。
$gyms = Gym::whereHas('facilities', function (Builder $query) use ($facilities) {
$query->whereIn('facilities.id', $facilities);
})->get();
以上内容将返回与数组中一个或多个id
相匹配的结果。如果只想返回包含数组中所有ID的匹配项,则可以使用whereHas()
的第3和第4参数来指定此匹配项:
$gyms = Gym::whereHas('facilities', function (Builder $query) use ($facilities) {
$query->whereIn('facilities.id', $facilities);
}, '=', count($facilities)) //<-- This bit
->get();
以上假设id
中没有重复的$facilities
,并且数据库中存在所有id
。
答案 1 :(得分:0)
WhereIn()的计算结果为true。如果您需要AND逻辑(而不是OR逻辑),请使用常规where()
$gyms = Gym::query()
foreach ($facilities as $key => $value) {
$gyms->whereHas('facilities', function (Builder $query) use ($facilities) {
$query->where('facilities.id', $value);
});
}
$gyms = $gyms->get();