Donc, je peux le faire avec Eloquent:
$roles = DB::table('roles')->lists('title', 'name');
Mais existe-t-il un moyen de faire en sorte qu'Eloquent récupère un tableau de valeurs pour chaque clé distincte au lieu d'une seule colonne?
Par exemple, quelque chose comme ce qui suit:
$roles = DB::table('roles')->lists(['*', DB:raw('COALESCE(value, default_value)')], 'name');
Vous pouvez utiliser la méthode keyBy
:
$roles = Role::all()->keyBy('name');
Si vous n'utilisez pas Eloquent, vous pouvez créer votre propre collection:
$roles = collect(DB::table('roles')->get())->keyBy('name');
Si vous utilisez Laravel 5.3+, le générateur de requêtes renvoie maintenant une collection. Il n'est donc pas nécessaire de l'envelopper manuellement dans une collection:
$roles = DB::table('roles')->get()->keyBy('name');
Si vous avez besoin d'un key/value
tableau, depuis Laravel 5.1
vous pouvez utiliser pluck
. De cette façon, vous pouvez indiquer quels attributs vous souhaitez utiliser comme value
et comme key
.
$plucked = MyModel::all()->pluck('MyNameAttribute', 'MyIDAttribute');
return $plucked->all();
Vous obtiendrez un tableau comme suit:
array:3 [▼
1 => "My MyNameAttribute value"
2 => "Lalalala"
3 => "Oh!"
]
Vous pouvez essayer quelque chose comme ça:
$roles = array();
array_map(function($item) use (&$roles) {
$roles[$item->id] = (Array)$item; // object to array
}, DB::table('roles')->get());
Si vous voulez obtenir un Object
au lieu d'un Array
comme valeur, supprimez simplement le (Array)
.
Alternative: Utilisation de Eloquent
modèle (au lieu de DB::table
):
$roles = array();
array_map(function($item) use (&$roles) {
$roles[$item['id']] = $item;
}, Role::all()->toArray());
ne autre alternative: Utiliser la méthode Collection::map()
:
$roles = array();
Role::all()->map(function($item) use(&$roles) {
$roles[$item->id] = $item->toArray();
});