使用HasMany关系过滤模型

时间:2018-01-05 10:35:38

标签: laravel eloquent has-many

假设我有两个模型:ParkItems。每个Park可以有多个Items,通过HasMany关系。

Items表格中有一个park_id字段和一个type标记:Item可以是喷泉,或篮球场,或其他什么。

我需要做的是过滤公园,只获得那些拥有数组中传递的所有项类型的人。这就是我所拥有的:

$parks = Park::whereHas('items', function($q) use ($request) {
            $q->where('type', json_decode($request->type_list));
        })->get();

但它不能正常工作。有什么想法吗?

非常感谢,祝大家新年快乐!

编辑:我发现了一个非常难看的解决方案:

$types_array = json_decode($request->type_list, true);

$results = [];

// A collection of parks for each item type
foreach($types_array as $type) {
    $results[] = Park::whereHas('items', function($q) use ($type) {
        $q->where('type', $type);
    })->get();
}

// Intersect all collections
$parks = $results[0];
array_shift($results);

foreach ($results as $collection) {
    $parks = $collection->intersect($parks);
}

return $parks;

3 个答案:

答案 0 :(得分:1)

您可以在whereHas方法中使用foreach。它应该是这样的:

$array = json_decode($request->type_list, true)
$parks = Park::whereHas('items', function($q) use ($array) {
             foreach ($array as $key => $type) {
                 $q->where('type', $type);
             }
         })->get();

答案 1 :(得分:0)

我认为使用where子句匹配同一行的所有项目类型将不会产生任何结果,这就像执行where id = 1 and id = 2一样,这是不可能的,因为id只能使用一个值,你应该做的是使用{{ 1}}获取至少匹配一种类型的所有项目,然后使用whereIngroupBy对结果进行分组,然后在having子句中检查组计数是否等于park_id数:

type_list

答案 2 :(得分:0)

您可以向一个查询添加多个whereHas()约束:

$types_array = json_decode($request->type_list, true);
$query = Park::query();
foreach($types_array as $type) {
    $query->whereHas('items', function($q) use($type) {
        $q->where('type', $type);
    });
}
$parks = $query->get();