Как элегантно настроить имя ключа коллекции в 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"
  ]
]

I want to know if there is a better and more beautiful implementation for this kind of demand in laravel?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
2 118
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

dd($colors);

Я могу ошибаться, однако она, кажется, использует отношение к результатам поиска, что означает, что метод ->select() недоступен.

Josh 30.05.2019 02:14

Метод ошибки Illuminate\Database\Eloquent\Collection::select не существует.

Linda Vanessa 30.05.2019 02:15

Отлично, этот код может применяться к родительской модели. ВЫ МОЖЕТЕ ИСПОЛЬЗОВАТЬ ОТВЕТ ДЖОША выше stackoverflow.com/a/56370088/4551227

Jesus Erwin Suarez 30.05.2019 02:24

Метод @JesusErwinSuarez Illuminate\Database\Eloquent\Collection::select не существует. Потому что цвет нужно записывать как color()

Linda Vanessa 30.05.2019 02:47

Понятно, спасибо. Я только что понял разницу между цветом и цветом() цвет - переменная цвет() - экземпляр Если я не ошибаюсь.

Jesus Erwin Suarez 30.05.2019 03:51

В коллекции Laravel есть метод ->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#только метод

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

Привет, большое спасибо, php $colors = Phone::find($phone_Id)->color->only(['id', 'name']); dd($colors); результат: shell Collection {#861 ▼ #items: [] }

Linda Vanessa 30.05.2019 02:20

Добро пожаловать @Angu. Если это был ответ, который вы ищете, вы можете сказать людям, что на него есть ответ, поставив галочку.

Josh 30.05.2019 02:21

По вашим советам придумал самый простой способ. $colors = Phone::find($phone_Id)->color()->get(['id', 'имя как текст'])->toArray();

Linda Vanessa 30.05.2019 02:40

Извините, коллекция пуста, потому что вам нужно написать цвет как color()

Linda Vanessa 30.05.2019 02:48

Большое спасибо, ваш метод действительно дает эффект.

Linda Vanessa 30.05.2019 02:49
Ответ принят как подходящий

Используя ->trasform(..):

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

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

Редактировать: спасибо за правильный ответ и голоса, но я хотел бы отметить, что ОП пришел к гораздо более элегантному решению, используя построитель запросов ->get(..) и переименовав столбцы:

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

Спасибо большое, я придумал более простой способ. php $colors = Phone::find($phone_Id)->color()->get(['id', 'name as text'])->toArray(); Для реализации требуется всего лишь кусок кода

Linda Vanessa 30.05.2019 02:44

О, хорошо, да, это элегантно

DevK 30.05.2019 02:45

Другие вопросы по теме