Метод keyBy
Метод keyBy применяется к коллекции Eloquent или обычной коллекции и возвращает новую коллекцию с ключами, соответствующими значениям указанного поля. В качестве первого параметра передаётся имя поля, либо замыкание, которое определяет ключ для каждого элемента. Если в коллекции встречаются одинаковые ключи, последний элемент перезапишет предыдущий.
Синтаксис
<?php
$collection->keyBy($field);
$collection->keyBy(function($item, $key) { return $keyValue; });
?>
Пример
Давайте переиндексируем коллекцию пользователей по полю 'id':
<?php
use Illuminate\Support\Collection;
$users = collect([
['id' => 1, 'name' => 'John'],
['id' => 2, 'name' => 'Jane'],
['id' => 3, 'name' => 'Bob']
]);
$res = $users->keyBy('id');
echo $res->toJson();
?>
Результат выполнения кода:
{"1":{"id":1,"name":"John"},"2":{"id":2,"name":"Jane"},"3":{"id":3,"name":"Bob"}}
Пример
Давайте переиндексируем коллекцию по полю 'email':
<?php
use Illuminate\Support\Collection;
$users = collect([
['email' => 'john@mail.com', 'name' => 'John'],
['email' => 'jane@mail.com', 'name' => 'Jane'],
['email' => 'bob@mail.com', 'name' => 'Bob']
]);
$res = $users->keyBy('email');
echo $res->toJson();
?>
Результат выполнения кода:
{"john@mail.com":{"email":"john@mail.com","name":"John"},"jane@mail.com":{"email":"jane@mail.com","name":"Jane"},"bob@mail.com":{"email":"bob@mail.com","name":"Bob"}}
Пример
Давайте переиндексируем коллекцию с помощью замыкания, которое комбинирует два поля:
<?php
use Illuminate\Support\Collection;
$users = collect([
['id' => 1, 'name' => 'John'],
['id' => 2, 'name' => 'Jane'],
['id' => 3, 'name' => 'Bob']
]);
$res = $users->keyBy(function($item, $key) {
return 'user_' . $item['id'];
});
echo $res->toJson();
?>
Результат выполнения кода:
{"user_1":{"id":1,"name":"John"},"user_2":{"id":2,"name":"Jane"},"user_3":{"id":3,"name":"Bob"}}
Пример
Рассмотрим ситуацию с дублирующимися ключами - последний элемент перезапишет предыдущий:
<?php
use Illuminate\Support\Collection;
$users = collect([
['id' => 1, 'name' => 'John'],
['id' => 2, 'name' => 'Jane'],
['id' => 1, 'name' => 'Bob']
]);
$res = $users->keyBy('id');
echo $res->toJson();
?>
Результат выполнения кода:
{"1":{"id":1,"name":"Bob"},"2":{"id":2,"name":"Jane"}}
Пример
Применим метод keyBy к результатам запроса Eloquent:
<?php
use App\Models\User;
use Illuminate\Support\Collection;
$users = User::where('status', 'active')->get();
$res = $users->keyBy('id');
foreach ($res as $id => $user) {
echo "{$id}: {$user->name}";
}
?>
Результат выполнения кода:
"1: John"
"2: Jane"
"3: Bob"
Смотрите также
-
метод
groupBy,
который группирует элементы коллекции по указанному ключу -
метод
pluck,
который извлекает значения указанного поля -
метод
mapWithKeys,
который преобразует элементы коллекции в новые ключи и значения -
метод
Arr::keyBy,
который выполняет ту же операцию для массивов