Как элегантно настроить имя ключа коллекции в laravel - PullRequest
2 голосов
/ 30 мая 2019
  1. Например, есть такая коллекция
$phone_Id = $request->get('q');
$colors = Phone::find($phone_Id)->color->toArray();
dd($colors);
результат печати
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"
    ]
  ]
]
Конечным результатом, который я хочу, является массив, подобный этому
array:2 [▼
  0 => array:2 [▼
    "id" => 8
    "text" => "red"
  ]
  1 => array:2 [▼
    "id" => 11
    "text" => "blue"
  ]
]
Итак, моя нынешняя практика такая:
$data = [];
foreach ($colors as $key => $val) {
    $data[$key]['id'] = $val->id;
    $data[$key]['text'] = $val->name;
}
dd($data);
результат печати
array:2 [▼
  0 => array:2 [▼
    "id" => 8
    "text" => "red"
  ]
  1 => array:2 [▼
    "id" => 11
    "text" => "blue"
  ]
]

Я хочу знать, есть ли лучшая и более красивая реализация для такого рода требований в laravel?

Ответы [ 3 ]

2 голосов
/ 30 мая 2019

Использование ->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();
0 голосов
/ 30 мая 2019

Laravel Collection имеет метод ->only() и ->map(), которые можно использовать следующим образом:

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

$colors->map(function($color) {
    $color->text = $color->name;
    unset($color->text);
})

https://laravel.com/docs/5.8/collections#method-only

https://laravel.com/docs/5.8/collections#method-map

0 голосов
/ 30 мая 2019

Используйте select('id', 'name')

Попробуйте это.

$colors = Phone::find($phone_Id)->color()->select('id', 'name')->get()->toArray()

dd($colors);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...