web-dev-qa-db-fra.com

Liste de colonnes éloquente par clé avec un tableau comme valeur?

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');
40
eComEvo

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

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!"
]
12
tomloprod

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();
});
8
The Alpha