首页 > 解决方案 > laravel 中如何优雅地自定义集合键名

问题描述

  1. 比如有这样一个集合
$phone_Id = $request->get('q');
$colors = Phone::find($phone_Id)->color->toArray();
dd($colors);
  1. 打印结果
array:2 [▼
  0 => array:6 [▼
    "id" => 8
    "name" => "red"
    "value" => "#fb6250"
    "created_at" => "2019-05-29 01:42:51"
    "updated_at" => "2019-05-29 01:42:51"
    "pivot" => array:4 [▼
      "phone_id" => 1
      "color_id" => 8
      "created_at" => "2019-05-29 01:42:51"
      "updated_at" => "2019-05-29 01:42:51"
    ]
  ]
  1 => array:6 [▼
    "id" => 11
    "name" => "blue"
    "value" => "#202020"
    "created_at" => "2019-05-29 01:42:51"
    "updated_at" => "2019-05-29 01:42:51"
    "pivot" => array:4 [▼
      "phone_id" => 1
      "color_id" => 11
      "created_at" => "2019-05-29 01:42:51"
      "updated_at" => "2019-05-29 01:42:51"
    ]
  ]
]
  1. 我想要的最终结果是这样的数组
array:2 [▼
  0 => array:2 [▼
    "id" => 8
    "text" => "red"
  ]
  1 => array:2 [▼
    "id" => 11
    "text" => "blue"
  ]
]
  1. 所以我现在的做法是这样的。
$data = [];
foreach ($colors as $key => $val) {
    $data[$key]['id'] = $val->id;
    $data[$key]['text'] = $val->name;
}
dd($data);
  1. 打印结果
array:2 [▼
  0 => array:2 [▼
    "id" => 8
    "text" => "red"
  ]
  1 => array:2 [▼
    "id" => 11
    "text" => "blue"
  ]
]

我想知道在laravel中对于这种需求是否有更好更漂亮的实现?

标签: phparrayslaravelcollections

解决方案


使用->trasform(..)

$colors = Phone::find($phone_Id)->color;

$colors->transform(function ($color) {
    return [
        'id' => $color->id,
        'text' => $color->name,
    ];
});

编辑:感谢您的正确答案和赞成票,但我想指出,OP 使用查询生成器->get(..)和重命名列来提供更优雅的解决方案:

$colors = Phone::find($phone_Id)->color()->get(['id', 'name as text'])->toArray();

推荐阅读