2017-02-06 4 views
5

Ich habe in ein Problem laufen, und es ist wirklich nur eine kleine Unannehmlichkeit, aber ...Laravel - zupfen Attribut mutierte

Im Grunde, was ich brauche, ist ein assoziatives Array für eine Auswahlbox. Normalerweise würde dies mit der Funktion pluck() erreicht werden.

Das Problem ist, das Attribut, das ich als 'Text' verwenden möchte, existiert nicht tatsächlich in der Datenbank, es ist ein Mutator, der zwei Felder zu einem kombiniert.

public function getNameAttribute() { 
    return $this->first_name . ' ' . $this->last_name; 
} 

Ich weiß, dass das Hinzufügen von 'name' Feld zum $appends Array auf dem Modell wird das Feld enthält, wenn das Modell auf Array-Casting, aber dies scheint nicht mit pluck()

Gibt es eine einfache Art und Weise zu arbeiten, Will ich erreichen wollen? Funktion oder Deklaration fehlt mir? Alles, was eloquenter ist, als die Sammlung manuell zu durchlaufen und ein eigenes Associate-Array zu erstellen?

Aktualisieren Ich bin ein Idiot. Ich übergab ein Array zu pflücken statt zwei Parameter. Anscheinend verwendet Zupfen das $appends Attribut. Beachten Sie, dies funktioniert nur bei der Arbeit mit Sammlungen $collection->pluck('mutatedValue', 'key');NICHT der Abfrage-Generator $queryBuilder->pluck('mutatedValue', 'id');

Danke für die Hilfe, Leute.

Antwort

4

Sie können das Attribut auf die Objekte in Ihrer Sammlung dynamisch anhängen:

$users->each(function ($model) { $model->setAppends(['name']); }); 
$users->pluck('name'); 

Dies hat den schönen Vorteil, nicht 'name' immer erforderlich ist Teil Ihrer Array-Daten sein, während die Sammlung ermöglicht name zu verwenden, nur in Zeit.

+0

Es stellte sich heraus, dass ich das doch nicht tun musste, aber +1 für eine etwas elegante Antwort. –

1

können Sie mit beredten abfragen und

$limited_select = User::all(['id', 'first_name', 'last_name']); 
$limited_select = array_flip($limited_select); 

Ich nahm Sie eine select * wenn möglich verhindern wollten verwenden.

die Auswahl Erzeugen Sie so etwas wie dies in Klinge tun können:

<select> 
    @foreach($limited_select as $user) 
     <option value={{$user->id}}> {{$user->getNameAttribute() }} </option> 
    @endforeach 
</select> 

Dies würde funktionieren, weil getNameAttribute() in Ihrem User Model wil wirken als Accessor.

Ihre zweite Option könnte eine rohe Abfrage verwenden, die eine concat hat, aber ich denke, der eloquente Weg ist eleganter.

+0

Das würde leider nicht die Ergebnisse liefern, die ich erwarte. Das Muster, nach dem ich suche, ist '' '$ array als $ id => $ name'''. Was Sie zur Verfügung gestellt haben, würde '' '$ array als $ index => $ attributes''' ergeben. Ich müsste immer noch die Sammlung durchlaufen und die Ergebnisse modifizieren, bevor Sie sie verwenden. –

+0

Nun Flip das Array dann http://php.net/manual/en/function.array-flip.php :) –

+0

array_flip würde nicht mit mehrdimensionalen Arrays arbeiten. jedes '' '$ attributes''' wäre ein Array' '['first_name =>' Example ',' last_name '=>' Guy ']' '' testet dies den folgenden Fehler '' 'array_flip() : Kann STRING- und INTEGER-Werte nur umdrehen! '' ' –

1

Ich war auf der Suche nach einer Antwort auf diese und endete mit einem anderen Ergebnis, also dachte ich, ich würde teilen.

User::get()->pluck('name'); 

Wenn Sie das Objekt zuerst erhalten, ist Ihr mutiertes Attribut zugänglich.

Verwandte Themen