2014-06-09 12 views
24

więc mogę to zrobić z wymowny:Wymowna lista kolumn według klucza z tablicą jako wartościami?

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

Ale czy jest jakiś sposób, aby Eloquent pobrać tablicę wartości dla każdego odrębnego klucza zamiast tylko jednej kolumny?

Na przykład coś takiego, co następuje:

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

Zamiast list, czy sprawdzane 'select'? –

+0

Tak, ale nie generuje par wartości kluczy, jak ma to miejsce w przypadku list(). – eComEvo

Odpowiedz

60

można użyć metody keyBy:

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

Jeśli nie używasz wymowny, można utworzyć kolekcję na własną rękę:

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

Jeśli używasz laravel 5.3+, budowniczy zapytanie teraz faktycznie zwraca kolekcja, więc nie ma potrzeby ręcznego owinąć go w kolekcji jeszcze:

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

Nie miałem okazji przetestować 4.2, ale będzie to w moim następnym projekcie. To wygląda na bardzo proste rozwiązanie i cieszę się, że zostało to zaimplementowane. – eComEvo

+7

@eComEvo - [ja osobiście to zaimplementowałem] (https://github.com/laravel/framework/pull/4828) dla Ciebie :) –

+0

Uwaga: Wciąż używasz pętli foreach wewnątrz, więc dla wydajności to nie zrobi duża różnica, to będzie tylko bardziej Laravel sposób. – Arda

5

Można spróbować czegoś takiego:

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

Jeśli chcesz otrzymać Object zamiast Array jako wartość a potem po prostu usunąć (Array).

Alternatywa: Korzystanie Eloquent modelu (zamiast DB::table):

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

Inną alternatywą: Korzystanie Collection::map() metody:

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

Miałem nadzieję, że istnieje wbudowana metoda, której właśnie brakowało w dokumentach, ale to zrobi. Czystsze niż pętla foreach, której początkowo używałem. :) – eComEvo

3

Jeśli potrzebujesz key/value tablicę, ponieważ Laravel 5.1 możesz użyć pluck. W ten sposób możesz wskazać, które atrybuty chcesz użyć jako key i jako value.

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

return $plucked->all(); 

Dostaniesz tablicę następujące:

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