如何更新嵌套 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->deployments
不变。
还尝试使用嵌套的map
函数在第二级获得Call to a member function map() on array
异常,因为第二级和下一个嵌套级被视为数组...
有什么想法吗? 提前致谢。
【问题讨论】:
【参考方案1】:使用map
方法,您就快到了。您必须返回在$deployment
中所做的更改并在最后执行->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();
【讨论】:
谢谢!它按预期工作。但即使最后没有->all()
部分,它也可以工作。
对于处于相同情况的人:这是一个菜鸟错误,我忘记了 map
函数中的 return
语句。 ->all()
部分不是必需的。【参考方案2】:
对于研究此问题的任何人,更优雅的解决方案可能是:
更新单个地点:
$data = $deployments->all();
$deployments = data_set($data, 'spots.0.status', 'inactive');
更新所有景点:
$data = $deployments->all();
$deployments = data_set($data, 'spots.*.status', 'inactive');
【讨论】:
以上是关于如何更新嵌套 Laravel 集合中的嵌套值的主要内容,如果未能解决你的问题,请参考以下文章