[Collection] 求助教主

教主您好,我在做一个购物车的功能。 通过laravel的关联查询我得到如下数据:

[
    {
        "id": 1,
        "uid": 1,
        "product_id": 10,
        "product_type": 1,
        "buynum": 4,
        "good": {
            "id": 10,
            "good_sn": "TJD-2016-001",
            "good_name": "农家土鸡蛋",
            "shop": {
                "id": 2,
                "user_id": 2,
                "name": "影视度假村欢",
                "company": "影视度假村欢"
            }
        }
    },
    {
        "id": 2,
        "uid": 1,
        "product_id": 11,
        "product_type": 1,
        "buynum": 1,
        "good": {
            "id": 11,
            "good_sn": "TYD-2016-002",
            "good_name": "农家土鸭蛋",
            "shop": {
                "id": 2,
                "user_id": 2,
                "name": "影视度假村欢",
                "company": "影视度假村欢"
            }
        }
    },
    {
        "id": 3,
        "uid": 1,
        "product_id": 12,
        "product_type": 1,
        "buynum": 1,
        "good": {
            "id": 12,
            "good_sn": "sg-2016-002",
            "good_name": "西夏水果王",
            "shop": {
                "id": 1,
                "user_id": 1,
                "name": "鲜果世家休闲农业观光园",
                "company": "鲜果世家休闲农业观光园"
            }
        }
    }
]

但是我需要将数据转化成:

array:2 [
  2 => array:28 [
    "id" => 2
    "user_id" => 2
    "name" => "影视度假村欢"
    "company" => "影视度假村欢" 
    "goods" => array:2 [
      0 => array:7 [
        "id" => 1
        "good_sn" => "TJD-2016-001"
        "good_name" => "农家土鸡蛋" 
        "uid" => 1
        "product_id" => 10
        "product_type" => 1
        "buynum" => 4 
      ]
      1 => array:7 [
        "id" => 2
        "good_sn" => "TYD-2016-002"
        "good_name" => "农家土鸭蛋" 
        "uid" => 1
        "product_id" => 11
        "product_type" => 1
        "buynum" => 1 
      ]
    ]
  ]
  1 => array:28 [
    "id" => 1
    "user_id" => 1
    "name" => "鲜果世家休闲农业观光园"
    "company" => "鲜果世家休闲农业观光园" 
    "goods" => array:1 [
      0 => array:7 [
        "id" => 3
        "good_sn" => "sg-2016-002"
        "good_name" => "西夏水果王" 
        "uid" => 1
        "product_id" => 12
        "product_type" => 1
        "buynum" => 1
      ]
    ]
  ]
]

也就是按照shop分组来取。 当然,通过其他的方式也能实现。但是看到您的视频,想通过collect实现下。最终未能实现。请您给帮帮忙~

另外您的在视频中讲的都是单独的数据。实际和laravel的结合您能不能在出些视频?

JellyBool

可否修改一下你的帖子?把你的代码的原始格式放上来,而不是这种打印的形式?

如果你有原始的代码格式的话,因为这样我直接拷贝这个数组,貌似需要花很多时间在调格式

关于在 laravel 项目的运用的话,其实都是一样的吧,你使用 Eloquent 或者 DB 查询的结果集就是 Collection,可以直接用

yurenzhen 回复 JellyBool

额,我是从数据库取出来打印的。我来调整吧。调整好后再联系您。

JellyBool 回复 yurenzhen

行吧,那我简化一下。。。

JellyBool

试了一下,貌似这样就可以了:

$result = collect($goods)->groupBy('good.shop.id')->toArray(); // 

不知道这是你的需求不?

yurenzhen 回复 JellyBool

貌似不行~ 我把数据更新成json的,您看这样行么?

JellyBool 回复 yurenzhen

额。。。如果你的 $goods 是从数据库直接查询出来的话:

$result = $goods->groupBy('good.shop.id')->toArray()

这样试试?

yurenzhen 回复 JellyBool

我是在购物车页面展示, 需要像淘宝那样,多个商品合并到一家店铺下用一些本办法也能实现。但是终究还是想试试新东西

JellyBool 回复 yurenzhen

我这边测试的话,上面的方法是可以的。。。

2016-11-15_23-41-39-1

yurenzhen 回复 JellyBool

您可能没明白我的意思~ 我在上面有需要的结果格式,就是说把shop放出来,把商品信息和购物车信息合并~
···
2 => array:28 [
“id” => 2
"user_id" => 2
"name" => “影视度假村欢”
“company” => “影视度假村欢”
“goods” => array:2 [
0 => array:7 [
“id” => 1
"good_sn" => “TJD-2016-001"
“good_name” => “农家土鸡蛋”
“uid” => 1
"product_id” => 10
"product_type" => 1
"buynum" => 4
]
1 => array:7 [
“id” => 2
"good_sn" => “TYD-2016-002"
“good_name” => “农家土鸭蛋”
“uid” => 1
"product_id” => 11
"product_type" => 1
"buynum" => 1
]
]
]
···

yurenzhen 回复 JellyBool

教主,有办法转成那种格式么?

happyqian

你这个不能合并吧,因为你$goods里有两条数据了。你这是一对多,不是一对一,如果一对一就可以合并成一个数据

yurenzhen 回复 happyqian

看来还是得foreach去解决了~

wangsong1234

和你要的结果一样

        $json = (new Filesystem())->get(public_path('1.json'));

        $json = collect(json_decode($json, true))->groupBy('good.shop.id')->map(function (Collection $company) {

            $data          = Arr::get($company->first(), 'good.shop');
            $data['goods'] = $company->map(function ($good) {

                Arr::forget($good, 'good.shop');
                $g = $good['good'];
                Arr::forget($good, 'good');

                return array_merge($g, $good);
            })->toArray();

            return $data;
        });

        dump($json->toArray());