Laravel 5:如何根据项目的列值动态地按一列或另一列对一个集合进行分组?

时间:2017-03-03 13:23:36

标签: php mysql laravel group-by eloquent

我有一个项目集合作为Eloquent模型查询的结果。我需要做的是以某种方式将该集合的项目按一列或另一列分组,具体取决于特定项目的字段值,如果它满足条件。是否可以在groupBy()内使用函数,或者有其他方法可以执行此操作,如果可能的话?如果需要,我会提供额外的细节,以备有这种情况的理论解决方案。

更新

以下是我创建两个单独的集合然后对每个集合进行分组的代码:

...

// First collection which is grouped by grouping_field1
$non_grouped_products = Product::with("some_relation")
    ->whereHas("some_relation", function($q) {
        $q->where("conditional_field", 0)
            ->where("some_field1", 1)
            ->orWhere("some_field2", 0);
    })->where("some_field3", "some_value")
    ->where("some_field4", "some_value2")
    ->get()
    ->groupBy("grouping_field1");

// Second collection which is grouped by grouping_field2
$products = Product::with("some_relation")
    ->whereHas("some_relation", function($q) {
        $q->where("conditional_field", 1)
            ->where("some_field1", 1)
            ->orWhere("some_field2", 0);
    })->where("some_field3", "some_value")
    ->where("some_field4", "some_value2")
    ->get()
    ->groupBy("grouping_field2");

$all_products = [];

// Here is where I join the collections
foreach ($products as $key => $product) {
    $all_products[$key] = $product;
}
foreach ($non_grouped_products as $key => $product) {
    $all_products[$key] = $product;
}

$merged_collection = new Collection($all_products);

...

为什么我需要避免制作两个集合是因为​​我想只创建一个orderBy()而不是在每个初始集合上单独执行它,因为合并后的顺序不再正确。 我需要检查conditional_field的值,如果它满足一个或另一个条件,我需要通过其中一个分组字段对项目进行分组。

我希望我足够明确。如果您需要其他一些细节,我会将它们提供给您,以便您更容易理解所有情况以及我需要达到的具体目标。先感谢您! :)

1 个答案:

答案 0 :(得分:0)

the docs可以看出,groupBy函数的第一个参数是可调用的|串。所以是的,这是可能的,但我们只能在你发布代码时提供帮助