加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

使用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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读