2017-12-18 5 views
0

Ich habe ein Modell Review, das einen Unix-Zeitstempel als 1 seiner Attribute (Tabellenkolumnen) hat.Warum erscheint mein Laravel Eloquent Accessor nicht in der Antwort?

Ich benutze 2 accessors in diesem Modell:

public function getReviewDateAttribute($value) 
{ 
    return strftime('%A %e %B %Y', $value); 
} 

public function getReviewDateIsoAttribute() 
{ 
    return Carbon::createFromTimestamp($this->review_date)->toDateTimeString(); 
} 

getReviewDateAttribute funktioniert wie erwartet und zeigt sich in der Sammlung von Modellen, wenn ich eine Abfrage schreiben.

Allerdings nicht getReviewDateIsoAttribute nicht. Was könnte der Grund dafür sein? Eine Teilfrage: Wenn ich das gleiche Attribut in beiden Funktionen verwende, wie kann ich das ursprüngliche Format als Eingabewert verwenden?

enter image description here

Antwort

3

Sie sollten es dem $appends Array hinzufügen. Es durchläuft nicht alle verfügbaren Methoden, die nach getXXXXXAttribute suchen. Das andere wird verwendet, weil es ein Accessor für ein tatsächliches Attribut ist, dieses ist kein tatsächliches Attribut.

class YourModel .... 
{ 
    protected $appends = ['review_date_iso']; 
    ... 
} 

Laravel 5.5 Docs - Eloquent - Serialization - Appending Values to JSON

1

Dies ist wahrscheinlich, weil ReviewDateIso nicht eine tatsächliche Spalte ist und wird daher nicht in den Modellsammlungen zeigen ... Sie es direkt direkt durch Aufruf der Methode zugreifen können

$model->getReviewDateIsoAttribute() 

Gemäß den Docs-Zugriffsmethoden können Sie den Wert einer Spalte ändern, bevor sie an die Methode zurückgegeben wird, die sie abgefragt hat.

Wenn Sie es wollen, um zu zeigen, wenn Sie die Sammlung nennen als Json es an den Ausgang anhängen mit

protected $appends = ['name_of_attribute']; 
+1

Ich verstehe, was Sie versuchen zu sagen, aber Laravel 'Accessoren' sind" magische "Funktionen, die Attribute im laufenden Betrieb erstellen, daher sollte dies noch funktionieren. Bitte werfen Sie einen Blick auf das 'getFullNameAttribute' Beispiel der Dokumentation. –

+0

Es könnte auch etwas mit der Art und Weise zu tun, wie Ihre Abfrage Strukturen ist, hier ist ein Link zu einem Problem wie das https://laracasts.com/discuss/channels/laravel/custom-accessor-not-working-anymore – carrion

0

In der Tat es hängt davon ab, was Sie erreichen wollen. Wenn Sie z. B. in Blade etwas anzeigen möchten, können Sie den Wert $object->review_date_iso verwenden, um diesen Attributwert zu erhalten.

Wenn Sie jedoch JSON-Antworten (z. B. API) zurückgeben, müssen Sie dem Eloquent-Modell mitteilen, dass beim Transformieren in das JSON-Format zusätzliche Felder an Ihr Modell angehängt werden.

Sie wahrscheinlich review_date Attribut in Ihrem Modell (das ist die Spalte in der Datenbank nehme ich an), aber sie haben nicht review_date_iso in der Tabelle in der Datenbank, also in Ihrem Modell Sie verwenden müssen:

protected $appends = ['review_date_iso']; 

aber Sie müssen nicht review_date hier einfügen, weil es bereits in Ihrer Tabelle in der Datenbank ist und Ihr Accessor automatisch ausgelöst wird.

Verwandte Themen