我有一个项目集合作为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
的值,如果它满足一个或另一个条件,我需要通过其中一个分组字段对项目进行分组。
我希望我足够明确。如果您需要其他一些细节,我会将它们提供给您,以便您更容易理解所有情况以及我需要达到的具体目标。先感谢您! :)