Laravel 5.2 pluck() несколько атрибутов из Eloquent Model Collection

В Laravel 5.2 есть довольно хорошие помощники, я хотел бы использовать их для выполнения следующих задач:

У меня есть коллекция моделей Eloquent:

$lesson->users(); // returns Eloquent collection of 3 users

pluck() Функция была бы полезна, но она может получить только один параметр. Однако я хочу получить вывод с двумя параметрами, id а также name, как это:

[
1=>['id'=>10,'name'=>'Michael Dook'],
2=>['id'=>16,'name'=>'Henry Babcock'],
3=>['id'=>19,'name'=>'Joe Nedd']
]

Есть ли элегантное решение для этого?

9 ответов

Решение

Я знаю, что это не самый последний вопрос, но в случае, если кто-то случайно наткнется на него из Google, см. Метод Only Collection.

$lesson->users()->only("id", "name")->toArray(); должно быть то, что вы после.

pluck() предназначен только для получения одного значения для вас. не имеет значения.

использование only(['id','name']) на одной коллекции. Скорее тогда массив коллекций.

например

$collection = collect(['id' => 1, 'name' => 'Taylor']);
$collection->only(['name']);

Чтобы сделать это через массив коллекций, скажем,

$helloworld = collect([
   ['id' => 1, 'name' => 'Taylor'],
   ['id' => 2, 'name' => 'Some Guy'];
]);

использовать карту

$helloworld->map(function($aSingleCollection){
   return $aSingleCollection->only(['name']);
});

Замечания:

важно понимать ваши модели и какие из них возвращают коллекции или объекты построителя запросов.

Методы сбора будут применяться к моделям, расширяющим Eloquent Illuminate\Database\Eloquent\Model

Подробнее о коллекциях https://laravel.com/docs/5.8/collections

В случае, если кто-то хочет "собрать" несколько атрибутов и ввести их в качестве ключа (в качестве примера в качестве примера используется поле "name", "value" - это сам элемент - измените его, чтобы получить массив интересующих вас атрибутов):

$settings = \App\Setting::all()->map(function ($setting) {
    return ['key' => $setting->name, 'value' => $setting];
})->pluck('value', 'key')->toArray();

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

$lesson->users()->select('id', 'name')->get()->toArray();

Как указано в вопросе, $lesson->users()возвращает "Красноречивую коллекцию из 3 пользователей". Это не то же самое, как если быusers() была взаимосвязью в модели урока, которую многие ответы неправильно предполагали, и в этом случае она вернет построитель запросов.

Предполагая, что пользователи в коллекции являются моделями Eloquent, начиная с Laravel 5.5, вы можете просто сделать это:

$lesson->users()->map->only('id', 'name');

Если пользователи представляют собой простые массивы, вместо этого вы можете использовать:

$lesson->users()->map(fn ($user) => Arr::only($user, ['id', 'name']));
$result = $lesson->users()->map(function($item){ 
  return array('id' => $item->id, 'name' => $item->name)
});

Должен сделать свое дело.

Вспомогательная функция pluck() принимает второй параметр. Затем он вернет ассоциативный массив, где второй параметр определяет ключ. Таким образом, вы получите результат key => value пар.

Поскольку вы знаете, что ваши записи будут состоять из идентификатора и имени, возможно, это может помочь:

$lesson->users->pluck('name', 'id')->toArray();

Это вернет:

[
   10 => 'Michael Dook',
   16 => 'Henry Babcock',
   19 => 'Joe Nedd'
]

Я не уверен насчет Laravel 5.2, но это работает в Laravel 5.5

Если у вас есть коллекция моделей, вы можете использовать:

      $users->map->only('name', 'hobby');

// returns e.g.
// collect([
//     new User(['name' => 'matt', 'hobby' => 'coding']),
//     new User(['name' => 'tomo', 'hobby' => 'cooking']),
// ]);

Это работает только с моделями, потому что only Метод доступен только для моделей, но не для других элементов, которые могут быть в коллекции.

Для общего, более надежного решения, которое работает с коллекциями смешанных типов объектов, массивов и т. Д., Вы можете использовать pluckManyмакрос, который я внес в пакет laravel-collection-macros Spatie :

      $collection->pluckMany(['name', 'hobby']);

// returns e.g.
// collect([
//     (object) ['name' => 'marco', 'hobby' => 'drinking'],
//     (object) ['name' => 'belle', 'hobby' => 'cross-stitch'],
// ]);

Дополнительные сведения о pluckMany см. В моем сообщении в блоге о том, как извлечь несколько элементов из коллекции Laravel.

В Laravel 6.^

Метод сбора ->only() возвращает только указанные идентификаторы в коллекции.

в ->get()вы можете указать, какие столбцы возвращать. В коллекции вы можете использовать метод->keyBy('id') для установки ключа массива.

Чтобы вернуть записи с идентификатором в качестве ключа и массив, содержащий идентификатор и имя, используйте следующий код:

$lesson->users()->get(['id', 'name'])->keyBy('id')->toArray()

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