获取所有具有特定关系的模型

时间:2020-01-12 10:45:28

标签: php laravel eloquent

在我的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的数组。

2 个答案:

答案 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();