从Laravel Collection中提取属性数组

时间:2017-09-19 17:10:20

标签: php arrays laravel laravel-collection

我正在使用Laravel 5.3,我有一个格式如下的集合:

$categories = [
   {
      "id":1,
      "sub_categories":[
         {
            "id":1,
            "category_id":1
         }
      ]
   },
   {
      "id":7,
      "sub_categories":[
         {
            "id":5,
            "category_id":7,
         },
         {
            "id":6,
            "category_id":7
         }
      ]
   }
]

我需要提取所有sub_categories数组,但我找不到访问该属性内部数据的方法。根据{{​​1}}集合,我希望使用以下格式创建一个新的:

$categories

我尝试将地图采摘应用于[ { "id":1, "category_id":1 }, { "id":5, "category_id":7 }, { "id":6, "category_id":7 } ] ,但它会检索一个填充 null 的数组。

2 个答案:

答案 0 :(得分:2)

看起来flatMap会完全符合您的要求。我不确定为什么它会将项目作为数组返回给回调但是这对我有用...

$categories = collect((object) [
    [
        'id' => 1,
        'sub_categories' => [
            [
                'id' => 1,
                'category_id' => 1
            ]
        ]
    ],
    [
        'id' => 7,
        'sub_categories' => [
            [
                'id' => 5,
                'category_id' => 6
            ],
            [
                'id' => 6,
                'category_id' => 7
            ]
        ]
    ],
]);

dd($categories->flatMap(function($category) {
    return $category['sub_categories'];
}));

答案 1 :(得分:0)

pluck方法就行了。看起来如果您尝试获取的属性已通过Eloquent Relationships - Eager Loading检索到,您必须将关系的名称传递给pluck

我从DB那里得到我的收藏:

Category::where('team_id', Auth::user()->current_team_id)->with('subCategories')->get()‌​;

所以我必须将pluck方法称为$categories->pluck('subCategories');而不是$categories->pluck('sub_categories');