如何更新嵌套 Laravel 集合中的嵌套值

Posted

技术标签:

【中文标题】如何更新嵌套 Laravel 集合中的嵌套值【英文标题】:How to update a nested value within a nested Laravel collection 【发布时间】:2021-11-04 14:37:22 【问题描述】:

我有一个像这样的deployments Laravel 集合:

Illuminate\Support\Collection #415 ▼
  #items: array:5 [▼
    0 => array:7 [▼
      "id" => 31
      "status" => "active"
      "name" => "Deployment 1"
      "spots" => array:4 [▼
        0 => array:2 [▼
          "id" => 33
          "status" => "active"            <-- Want to change this
        ]
        1 => array:2 [▶]
        2 => array:2 [▶]
        3 => array:2 [▶]
      ]
      "data" => array:3 [▶]
    ]
    1 => array:7 [▶]
    2 => array:7 [▶]
    3 => array:7 [▶]
    4 => array:7 [▶]
  ]

我想将嵌套的status 值更新为inactive。我使用了 Laravel map 函数,但它似乎只适用于具有一个嵌套级别的集合。所以这...

$this->deployments->map(function ($deployment) 
    $deployment['spots'][0]['status'] = 'inactive';
);
dd($this->deployments);

...保持$this-&gt;deployments 不变。

还尝试使用嵌套的map 函数在第二级获得Call to a member function map() on array 异常,因为第二级和下一个嵌套级被视为数组...

有什么想法吗? 提前致谢。

【问题讨论】:

【参考方案1】:

使用map 方法,您就快到了。您必须返回$deployment 中所做的更改并在最后执行-&gt;all() 以使用修改后的值更新集合。

更新单个地点:

$deployments = $deployments->map(function($deployment)
    $deployment['spots'][0]['status'] = 'inactive';
    return $deployment;
  )->all();

更新所有景点:

$deployments = $deployments->map(function($deployment)
    foreach($deployment['spots'] as &$spot)
      $spot['status'] = 'inactive';
    
    return $deployment;
  )->all();

【讨论】:

谢谢!它按预期工作。但即使最后没有 -&gt;all() 部分,它也可以工作。 对于处于相同情况的人:这是一个菜鸟错误,我忘记了 map 函数中的 return 语句。 -&gt;all() 部分不是必需的。【参考方案2】:

对于研究此问题的任何人,更优雅的解决方案可能是:

更新单个地点:

$data = $deployments->all();
$deployments = data_set($data, 'spots.0.status', 'inactive');

更新所有景点:

$data = $deployments->all();
$deployments = data_set($data, 'spots.*.status', 'inactive');

【讨论】:

以上是关于如何更新嵌套 Laravel 集合中的嵌套值的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 资源中的嵌套集合解析

如何将嵌套列表中的值转换为集合?

Laravel - 如何使嵌套用户独一无二

如何在angular2中的数组中设置补丁值(更新嵌套值)?

Laravel - 遍历嵌套集合

Django Rest Framework,如何更新序列化程序中的嵌套值