Красноречивый список столбцов по ключу с массивом как значения?
Итак, я могу сделать это с помощью Eloquent:
$roles = DB::table('roles')->lists('title', 'name');
Но есть ли способ сделать Eloquent для получения массива значений для каждого отдельного ключа вместо одного столбца?
Например, что-то вроде следующего:
$roles = DB::table('roles')->lists(['*', DB:raw('COALESCE(value, default_value)')], 'name');
Ответы
Ответ 1
Вы можете использовать метод keyBy
:
$roles = Role::all()->keyBy('name');
Если вы не используете Eloquent, вы можете создать коллекцию самостоятельно:
$roles = collect(DB::table('roles')->get())->keyBy('name');
Если вы используете Laravel 5.3+, построитель запросов теперь фактически возвращает коллекцию, поэтому нет необходимости вручную вручную переносить ее в коллекцию:
$roles = DB::table('roles')->get()->keyBy('name');
Ответ 2
Вы можете попробовать что-то вроде этого:
$roles = array();
array_map(function($item) use (&$roles) {
$roles[$item->id] = (Array)$item; // object to array
}, DB::table('roles')->get());
Если вы хотите получить Object
вместо значения Array
as, просто удалите (Array)
.
Альтернатива: Использование модели Eloquent
(вместо DB::table
):
$roles = array();
array_map(function($item) use (&$roles) {
$roles[$item['id']] = $item;
}, Role::all()->toArray());
Другая альтернатива: Использование метода Collection::map()
:
$roles = array();
Role::all()->map(function($item) use(&$roles) {
$roles[$item->id] = $item->toArray();
});
Ответ 3
Если вам нужен массив key/value
, так как Laravel 5.1
вы можете использовать pluck
. Таким образом, вы можете указать, какие атрибуты вы хотите использовать как key
и как value
.
$plucked = MyModel::all()->pluck('MyNameAttribute', 'MyIDAttribute');
return $plucked->all();
Вы получите массив следующим образом:
array:3 [▼
1 => "My MyNameAttribute value"
2 => "Lalalala"
3 => "Oh!"
]