收集后Laravel无法展平数组->忘记

Posted

技术标签:

【中文标题】收集后Laravel无法展平数组->忘记【英文标题】:Laravel cant flatten array after collection->forget 【发布时间】:2019-10-04 23:13:17 【问题描述】:

我在 Laravel 集合中有一个循环内循环,有时我需要从第二个循环集合中删除一些对象。这是代码

public function remove_if_found($id)

    $all_groups = Group::all();
    $all_groups->load('templates');

    foreach ($all_groups as $group)
    
        foreach ($group->templates as $key => $template)
        
            if($template->id = $id)
            
                $group->templates->forget($key);
            
        
    

    return $all_groups;

问题是 group->templates 的集合从简单(不是 assoc)数组变成了对象。这是响应的外观示例

我正在尝试展平 $group->templates->flatten() 但在最终响应中,模板仍然是对象,而不是数组。

这个测试展平有效

    ...
    foreach ($all_groups as $group)
    
        foreach ($group->templates as $key => $template)
        
            if($template->id = $id)
            
                $group->templates->forget($key);
            
        

        return $group->templates->flatten()//This code works i get fluttened array
    

但最终变体仍然返回我对象而不是数组

    $all_groups = Group::all();
    $all_groups->load('templates');

    foreach ($all_groups as $group)
    
        foreach ($group->templates as $key => $template)
        
            if($template->id = $id)
            
                $group->templates->forget($key);
            
        

        $group->templates->flatten()//Use flatten here
    

    return $all_groups;//Templates are returned not as an array but still as an object (Same variant as on attached image)

【问题讨论】:

【参考方案1】:

使用values()重置键和setRelation()替换关系:

public function remove_if_found($id)

    $all_groups = Group::all();
    $all_groups->load('templates');

    foreach ($all_groups as $group)
    
        foreach ($group->templates as $key => $template)
        
            if($template->id = $id)
            
                $group->setRelation('templates', $group->templates->forget($key)->values());
            
        
    

    return $all_groups;

您也可以使用except() 代替forget()

public function remove_if_found($id)

    $all_groups = Group::all();
    $all_groups->load('templates');

    foreach ($all_groups as $group)
    
        $group->setRelation('templates', $group->templates->except($id));
    

    return $all_groups;

【讨论】:

是的,它可以工作,现在一切正常,我不明白 setRelation 是做什么的,现在将 google 一下,谢谢) 它在Model::$relations 属性中设置关系的值。 这有点像“临时”关系? 不,它会替换现有值。对于属性,您可以使用 $group->name = strtolower($group->name); 之类的东西。对于关系,这需要setRelation() 你太棒了,谢谢乔纳斯)

以上是关于收集后Laravel无法展平数组->忘记的主要内容,如果未能解决你的问题,请参考以下文章

Laravel MIN MAX GroupBy 来自集合

如何在laravel上收集数组?

Laravel:使用 unset() 后无法在急切加载中重新索引集合的数组

转载 | Python中多层List展平为一层

转载 | Python中多层List展平为一层

转载 | Python中多层List展平为一层