Mik*_*elL 9 php collections dictionary eloquent laravel-4
我有一个多维集合.我想迭代它并使用map()函数改变它的一些子对象和数组:https://laravel.com/docs/5.1/collections#method-map
示例内容:
[
{
'address': 'Somestreet 99'
'orders': [
{'id': 11},
{'id': 67}
]
}
]
Run Code Online (Sandbox Code Playgroud)
例
$deliveries = $delivery_addresses->map(function($delivery_address){
$orders = $delivery_address->orders->filter(function($order){
return $order->id == 67;
});
$delivery_address['address'] = 'A different street 44'
$delivery_address['orders'] = $orders;
$delivery_address['a_new_attribute'] = 'Some data...';
return $delivery_address;
});
Run Code Online (Sandbox Code Playgroud)
预期结果:
[
{
'address': 'A different street 44'
'orders': [
{'id': 67}
],
'a_new_attribute': 'Some data...;
}
]
Run Code Online (Sandbox Code Playgroud)
结果是只更改字符串类型变量.任何数组或对象都将保持不变.这是为什么以及如何绕过它?谢谢!=)
小智 13
collect($deliver_addresses)->map(function ($address) use ($input) {
$address['id'] = $input['id'];
$address['a_new_attribute'] = $input['a_new_attribute'];
return $address;
});
Run Code Online (Sandbox Code Playgroud)
处理您最近的修改,请尝试以下操作:
$deliveries = $deliver_addresses->map(function($da) {
$orders = $da->orders->filter(function($order) {
return $order->id == 67;
});
$da->unused_attribute = $orders->all();
return $da;
});
Run Code Online (Sandbox Code Playgroud)
在这种情况下,最有可能的情况是您正确覆盖了该属性。然后,当您尝试访问它时,Laravel正在查询orders()关系并撤消您的更改。就Laravel而言,这些是相同的:
$delivery_address->orders;
$delivery_address['orders'];
Run Code Online (Sandbox Code Playgroud)
这就是为什么更改仅在对象上起作用的原因。如果要永久保存,则实际保存,如果不使用临时属性来包含该数据。