2 回答
TA贡献1719条经验 获得超6个赞
仅收集解决方案将是这样的(将自定义宏放在应用程序的服务提供者中):
Collection::macro('whereDeep', function ($column, $operator, $value, $nested) {
return $this->where($column, $operator, $value)->map(function ($x) use ($column, $operator, $value, $nested) {
return $x->put($nested, $x->get($nested)->whereDeep($column, $operator, $value, $nested));
});
});
然后在需要的地方调用:
$yourArray->whereDeep('type', '!=', 1, 'children');
在您的示例中,宏的工作方式如下:
过滤所有元素,其中:(
type != 1
外部数组将保持不变,因为两个项目都有type => 0
)对于当前数组的每个元素:
从本指令的第一点开始,检索该
children
属性并对该子数组应用相同的过滤。children
用刚刚过滤的新子属性替换该属性。
无论如何,您应该尝试深入研究为什么关系过滤不起作用。如果正确优化,该解决方案将更有效。
TA贡献1982条经验 获得超2个赞
我找到了一个很好的解决方案,不需要所有这些递归或任何这些关系调用,所以我分享它:
使用:“gazsp/baum”
// get your object with roots method
$contents = Content::roots()->get();
// and simply run through the object and get whatever you need
// thanks to getDescendantsAndSelf method
$myArray = [];
foreach($contents as $content) {
$myArray[] = $content->getDescendantsAndSelf()->where('type', '!=', 1)->toHierarchy();
}
return $myArray;
这对我来说与上面的其他方法相同。
- 2 回答
- 0 关注
- 104 浏览
添加回答
举报