Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Eloquent column list by key with array as values?

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'); 
like image 488
eComEvo Avatar asked Jun 09 '14 23:06

eComEvo


2 Answers

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'); 
like image 162
Joseph Silber Avatar answered Oct 10 '22 22:10

Joseph Silber


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!" ] 
like image 27
tomloprod Avatar answered Oct 10 '22 21:10

tomloprod