web-dev-qa-db-ja.com

値として配列を持つキーによる雄弁な列リスト?

だから私はEloquentでこれを行うことができます:

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

しかし、Eloquentに、1つの列だけでなく、個別のキーごとに値の配列をフェッチさせる方法はありますか?

たとえば、次のようなもの:

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

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');
83
Joseph Silber

key/value配列が必要な場合、Laravel 5.1からpluckを使用できます。この方法で、valueおよびkeyとして使用する属性を指定できます。

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

return $plucked->all();

次のように配列を取得します。

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

次のようなものを試すことができます:

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

値としてObjectの代わりにArrayを取得したい場合は、_(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();
});
_
8
The Alpha