2013-08-06 9 views
34

Ich habe eine Sammlung von Objekten. Angenommen, die Objekte sind Tags:Laravel 4 - Get Array von Attributen aus der Sammlung

Ich möchte ein bestimmtes Attribut für jedes Tag abrufen, sagen Sie seinen Namen. Natürlich kann ich tun

foreach ($tags as $tag) { 
    $tag_names[] = $tag->name; 
} 

Aber gibt es eine mehr laravelish Lösung für dieses Problem?

Etwas wie $tags->name?

+0

'Tags- $> name' sollte –

+0

arbeiten hatte ich auch so zunächst gehofft, aber es funktioniert nicht:' nicht definierte Eigenschaft: Illuminate \ Database \ Eloquent \ Collection :: $ name' – severin

+0

@severin $ tags ist eine Sammlung von Objekten, nicht ein einzelnes Objekt mit einer Namenseigenschaft. Sie müssen durch $ -Tags iterieren, um jeden Tag-Namen zu erhalten. Es macht keinen Sinn, Namenseigenschaften von Tags zu erhalten. Wie wird es davon ausgehen, welche Name-Eigenschaft Sie tatsächlich drucken möchten. –

Antwort

68

Sammlungen haben eine lists Methode ähnlich der Methode für Tabellen von @Gadoma beschrieben.Es gibt ein Array zurück, das den Wert eines bestimmten Attributs für jedes Element in der Sammlung enthält.

Um die gewünschte Array von Namen aus meiner Sammlung von Tags abrufen ich einfach verwenden kann:

$tags->lists('name'); 

Update: Ab Laravel 5.2lists durch pluck ersetzt wird.

$tags->pluck('name'); 

Insbesondere stellt die laravel 5.2 upgrade guide, dass „[d] ie lists Methode auf der Sammlung, Query Builder und Eloquent Query Builder Objekte pluck umbenannt wurde. Die Methode Signatur gleich bleibt.“

+0

Die 'Listen' Methode ist ein sehr schönes Ergebnis. –

+1

Bei der Erstellung von HTML-Formular, funktioniert Listen zu gut: 'Form :: select ('Unterkategorie', Array (null => 'Bitte wählen') + $ Kategorie-> erste Subkategorien-> Listen ('Name', "id")) ' – RY35

+1

@BishalPaudel oder Sie können' $ firsSubcategories = $ category-> firstSubcategories-> lists ('name', 'id'); 'im Controller, dann' Form :: select ('Unterkategorie' , Array (null => 'Bitte wählen') + $ firsSubcategories) ', in Blade, egal. – briankip

3

Sie könnten dafür array_column verwenden (es ist eine PHP 5.5-Funktion, aber Laravel hat eine Hilfsfunktion, die das Verhalten zum größten Teil repliziert).

So etwas sollte ausreichen.

$tag_names = array_column($tags->toArray(), 'name'); 
+0

Danke. Das funktioniert. Ich denke jedoch, dass die "Listen" -Methode noch laravelistischer ist. – severin

+0

Ach natürlich, ich vergesse immer 'Listen'. –

25

Ja, Sie können es schön und leicht machen. Als Laravel 4 Documentation states können Sie

Abrufen alle Zeilen aus einer Tabelle

$users = DB::table('users')->get(); 

foreach ($users as $user) 
{ 
var_dump($user->name); 
} 

Abrufen einer einzelnen Zeile aus einer Tabelle

$user = DB::table('users')->where('name', 'John')->first(); 

var_dump($user->name); 

einer einzelnen Spalte einer Reihe tun Abrufen

$name = DB::table('users')->where('name', 'John')->pluck('name'); 

eine Liste der Spalte Suchen Werte

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

Diese Methode wird eine Reihe von Rollen Titel zurückzukehren. Sie können auch eine benutzerdefinierte Schlüsselspalte für das zurückgegebene Array angeben:

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

$users = DB::table('users')->select('name', 'email')->get(); 

$users = DB::table('users')->distinct()->get(); 

$users = DB::table('users')->select('name as user_name')->get(); 

EDIT A Select-Klausel angeben:

Die obigen Beispiele zeigen, wie man Zugang Daten mit Hilfe von Laravels flüssigem Query Builder. Wenn Sie Modelle verwenden, können Sie auf die Daten zugreifen mit Laravel's Eloquent ORM

Da Eloquent ist internaly den Query Builder verwenden, können Sie ohne Probleme tun folgende Dinge:

$tag_names = $tags->lists('tag_name_label', 'tag_name_column')->get(); 

, die auch mit getan werden könnte:

$tag_names = DB::table('tags')->lists('tag_name_label', 'tag_name_column')->get(); 
+0

Danke. Dies hat mich tatsächlich zu einer geeigneten Lösung geführt, aber es scheint einige Verwirrung in Ihrer Antwort zwischen DB-Methoden und Methoden zu geben, die für Sammlungen gelten. – severin

+0

Bearbeitet nach Ihrem Kommentar. Grüße, – Gadoma

+0

Ich denke, in Ihrem Edit sollte es Tag :: lists ('tag_name_label') sein -> get(); – Anji

7

Hier sind ein paar Schnipsel aus meinen eigenen Experimenten zu diesem Thema heute Morgen. Ich wünschte nur (und vielleicht kennt jemand anders die Lösung), dass die Collection eine $ collection-> distinct() -Methode hatte, so dass ich leicht eine Liste von Spaltenwerten basierend auf einer bereits gefilterten Sammlung erzeugen konnte.

Gedanken?

Ich hoffe, diese Snippets helfen, einige alternative Optionen zum Generieren einer Liste von eindeutigen Werten aus einer Tabelle, Sammlung und Eloquent-Modell zu klären.

eine Sammlung verwenden (glücklich)

/** 
* Method A 
*  Store Collection to reduce queries when building multiple lists 
*/ 
$people = Person::get(); 
$cities = array_unique($people->lists('city')); 
$states = array_unique($people->lists('state')); 
// etc... 

ein beredtes Modell (Happier)

/** 
* Method B 
*  Utilize the Eloquent model's methods 
*  One query per list 
*/ 
// This will return an array of unique cities present in the list 
$cities = Person::distinct()->lists('city'); 
$states = Person::distinct()->lists('state'); 

ein beredtes Modell PLUS Caching (Happiest) Mit

/** 
* Method C 
*  Utilize the Eloquent model's methods PLUS the built in Caching 
*  Queries only run once expiry is reached 
*/ 
$expiry = 60; // One Hour 
$cities = Person::remember($expiry)->distinct()->lists('city'); 
$states = Person::remember($expiry)->distinct()->lists('state'); 

Ich würde gerne einige Alternativen dazu hören, wenn Sie eine haben!

@ErikOnTheWeb

Verwandte Themen