Laravel: Virtuelle Attribute mit JSON

In meinem aktuellen Projekt mit Laravel 5 stand ich vor folgendem Problem: Model A hat eine 1 : n Beziehung mit Model B. Bei einer JSON Response möchte ich nun möglichst einfach sowohl die Daten von Model A als auch die Anzahl an verknüpften Models B zurückgeben können. Dies konnte ich mit virtuellen Attributen relativ einfach erreichen.

Virtuelle Attribute in Laravel

Was ist denn der Unterschied zwischen einem virtuellen und einem normalen Attribut? Ganz einfach eigentlich:

Ein normales Attribut hat eine physische Repräsentation – wird also zum Beispiel in einer Datenbank abgelegt und kann von dort wieder ausgelesen werden. Ein virtuelles Attribut existiert nur zur Laufzeit – stellt also zum Beispiel das Ergebnis einer Berechnung dar (oder in unserem Beispielfall: einer Zählung). Wie legen wir so ein virtuelles Attribut nun an?

Unser Beispiel stellt ein Model für einen Post dar (zum Beispiel für einen Blog). Über die Beziehung comments wird eine hasMany Beziehung zu einem Model Comment hergestellt. Die Methode getTotalCommentsAttribute sorgt dafür, dass wir automatisch ein neues virtuelles Attribut haben, welches wir mit $post->total_comments abrufen können. Der Name der Methode setzt sich dabei ganz simpel aus get, dem Namen des Attributs in CamelCase und dann noch dem Wörtchen Attribute zusammen.

In diesem virtuellen Attribut wird die Anzahl an Kommentaren gezählt, die diesem Post zugeordnet sind. Diese Zahl wird dann einfach zurückgegeben.

Soweit so gut, das Problem sehen wir aber nun sobald wir unser Model mit $post->toJson() in ein JSON Objekt umwandeln wollen – unser virtuelles Attribut total_comments taucht hier nämlich nicht auf. Doch glücklicherweise gibt es auch dafür eine simple Lösung in Laravel: das $appends Attribut.

Dadurch können virtuelle Attribute problemlos in JSON exportiert werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*