Подтвердить что ты не робот

Красноречивый список столбцов по ключу с массивом как значения?

Итак, я могу сделать это с помощью Eloquent:

$roles = DB::table('roles')->lists('title', 'name');

Но есть ли способ сделать Eloquent для получения массива значений для каждого отдельного ключа вместо одного столбца?

Например, что-то вроде следующего:

$roles = DB::table('roles')->lists(['*', DB:raw('COALESCE(value, default_value)')], 'name');
4b9b3361

Ответ 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!"
]