Eloquent column list by key with array as values?

PhpLaravelLaravel 4Eloquent

Php Problem Overview


So I can do this with Eloquent:

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

But is there a way to make Eloquent fetch an array of values for each distinct key instead of just one column?

For instance, something like the following:

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

Php Solutions


Solution 1 - Php

You can use the keyBy method:

$roles = Role::all()->keyBy('name');

If you're not using Eloquent, you can create a collection on your own:

$roles = collect(DB::table('roles')->get())->keyBy('name');

If you're using Laravel 5.3+, the query builder now actually returns a collection, so there's no need to manually wrap it in a collection again:

$roles = DB::table('roles')->get()->keyBy('name');

Solution 2 - Php

If you need a key/value array, since Laravel 5.1 you can use pluck. This way you can indicate which attributes you want to use as a value and as a key.

$plucked = MyModel::all()->pluck(
  'MyNameAttribute', 
  'MyIDAttribute'
);

return $plucked->all();

You will get an array as follow:

array:3 [▼
   1 => "My MyNameAttribute value"
   2 => "Lalalala"
   3 => "Oh!"
]

Solution 3 - Php

You may try something like this:

$roles = array();
array_map(function($item) use (&$roles) {
    $roles[$item->id] = (Array)$item; // object to array
}, DB::table('roles')->get());

If you want to get an Object instead of an Array as value then just remove the (Array).

Alternative: Using Eloquent model (Instead of DB::table):

$roles = array();
array_map(function($item) use (&$roles) {
    $roles[$item['id']] = $item;
}, Role::all()->toArray());

Another Alternative: Using Collection::map() method:

$roles = array();
Role::all()->map(function($item) use(&$roles) {
    $roles[$item->id] = $item->toArray();
});

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioneComEvoView Question on Stackoverflow
Solution 1 - PhpJoseph SilberView Answer on Stackoverflow
Solution 2 - PhptomloprodView Answer on Stackoverflow
Solution 3 - PhpThe AlphaView Answer on Stackoverflow