首页 > 解决方案 > 获取所有具有特定关系的模型

问题描述

在我的 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 的健身房,但我需要同时拥有这两个设施的模型。

Gym 是我的示例中的模型 A,而 Facility 是模型 B。$facilities是一组 Facility ID。

标签: phplaraveleloquent

解决方案


要在 Laravel 中有一个“where in”子句,方法是whereIn()

$gyms = Gym::whereHas('facilities', function (Builder $query) use ($facilities) {
    $query->whereIn('facilities.id', $facilities);
})->get();

id以上将返回与数组中的一个或多个 s 匹配的结果。如果您只想返回包含数组中所有 id 的匹配项,您可以使用以下的第 3 个和第 4 个参数指定whereHas()

$gyms = Gym::whereHas('facilities', function (Builder $query) use ($facilities) {
    $query->whereIn('facilities.id', $facilities);
}, '=', count($facilities)) //<-- This bit
    ->get();

以上假设没有任何重复id的 '$facilities并且所有id' 都存在于数据库中。


推荐阅读