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()