使用Eloquent在PHP中合并数组的对象
发布时间:2020-12-13 16:09:36 所属栏目:PHP教程 来源:网络整理
导读:我使用Laravel的Eloquent ORM从我的数据库中抓取了一组对象(我没有使用Laravel将Eloquent集成到我自己的框架中).我使用 transform方法迭代集合并反序列化每个记录的一个列,然后 collapsed集合将所有未序列化的对象放在一个数组中. 这是逻辑: $orders = Orde
我使用Laravel的Eloquent ORM从我的数据库中抓取了一组对象(我没有使用Laravel将Eloquent集成到我自己的框架中).我使用
transform方法迭代集合并反序列化每个记录的一个列,然后
collapsed集合将所有未序列化的对象放在一个数组中.
这是逻辑: $orders = Order::where('user',$user)->orderBy('id','desc')->get(); $orders->transform(function($order,$key) { $order->cart = unserialize($order->cart); $items = $order->cart->items; return $items; }); $collapsed = $orders->collapse(); 并输出: [ { "qty": "2","price": 200,"item": { "id": 1,"title": "Black Hoodie","img": "https://s3.amazonaws.com/bucket/black-hoodie.jpg","description": "Plain Black Hoodie.","price": 100 } },{ "qty": "2","item": { "id": 2,"title": "Green Hoodie","img": "https://s3.amazonaws.com/bucket/green-hoodie.jpg","description": "Plain Green Hoodie.",{ "qty": 1,"price": 100,"price": 100 } } ] 现在我想要完成的是将这个数组中的所有相同对象(理想情况下是它们的“item”:{“id”}值组合成一个对象 – 将它们的数量和价格属性加在一起,使item属性保持不变. 我希望的输出会是 [ { "qty": "3","price": 300,{ "qty": "3","price": 100 } } ] Eloquent拥有TONS种可用于收藏的好方法,我只是坚持正确的组合以有效地实现我想要做的事情. 解决方法
试试这个:
use IlluminateSupportFluent; use IlluminateSupportCollection; // Mocking data to meet your requirements. // Wrapping attributes inside fluent object,// so we'll have almost same object like Eloquent model $orders = new Collection([ new Fluent([ 'qty' => 2,'price' => 200,'item' => new Fluent([ 'id' => 1,'price' => 100,'title' => 'Black Hoodie','img' => 'https://s3.amazonaws.com/bucket/black-hoodie.jpg','description' => 'Plain Black Hoodie.',]) ]),new Fluent([ 'qty' => 2,'item' => new Fluent([ 'id' => 2,'title' => 'Green Hoodie','img' => 'https://s3.amazonaws.com/bucket/green-hoodie.jpg','description' => 'Plain Green Hoodie.',new Fluent([ 'qty' => 1,]) ]) ]); // Here's something you might interested $result = $orders->groupBy('item.id') ->map(function ($orders,$itemId) { return new Fluent([ 'qty' => $orders->sum('qty'),// calculating quantity 'price' => $orders->sum('price'),// calculating total price 'item' => $orders->first()->item // leave the item as it is ]); }); // You may evaluate the result here dd($result); 更新 更“原始”的例子: use IlluminateSupportCollection; $orderOne = [ 'id' => 1,]; $orderTwo = [ 'id' => 2,]; $orders = new Collection([ [ 'qty' => 2,'item' => $orderOne ],[ 'qty' => 2,'item' => $orderTwo ],[ 'qty' => 1,'item' => $orderOne ] ]); $result = $orders->groupBy('item.id') ->map(function ($orders,$itemId) { return [ 'qty' => $orders->sum('qty'),'price' => $orders->sum('price'),'item' => $orders->first()['item'] ]; }); dd($result); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |