Ich möchte in der Lage sein, einem Laravel / Eloquent-Modell beim Laden ein benutzerdefiniertes Attribut / eine benutzerdefinierte Eigenschaft hinzuzufügen, ähnlich wie dies mit der RedBean- $model->open()
Methode erreicht werden kann.
Zum Beispiel habe ich im Moment in meinem Controller:
public function index()
{
$sessions = EventSession::all();
foreach ($sessions as $i => $session) {
$sessions[$i]->available = $session->getAvailability();
}
return $sessions;
}
Es wäre schön, die Schleife weglassen zu können und das Attribut 'verfügbar' bereits festgelegt und ausgefüllt zu haben.
Ich habe versucht, einige der in der Dokumentation beschriebenen Modellereignisse zu verwenden, um diese Eigenschaft beim Laden des Objekts anzuhängen, aber bisher ohne Erfolg.
Anmerkungen:
- 'verfügbar' ist kein Feld in der zugrunde liegenden Tabelle.
$sessions
wird als JSON-Objekt als Teil einer API zurückgegeben, und daher ist das Aufrufen von Elementen wie$session->available()
in einer Vorlage keine Option
protected $hidden = []
, um Spalten / Accessoren hinzuzufügen, die ausgeschlossen wurden.Das Letzte auf der Laravel Eloquent-Dokumentenseite ist:
Dies kann automatisch verwendet werden, um neue Accessoren zum Modell hinzuzufügen, ohne zusätzliche Arbeit wie das Ändern von Methoden wie
::toArray()
.Erstellen Sie einfach
getFooBarAttribute(...)
Accessor und fügen Sie dasfoo_bar
zu$appends
Array.quelle
toArray
Methode überschreiben .Wenn Sie Ihre
getAvailability()
Methode ingetAvailableAttribute()
Ihre Methode umbenennen , wird sie zu einem Accessor, und Sie können sie->available
direkt auf Ihrem Modell lesen .Dokumentation: https://laravel.com/docs/5.4/eloquent-mutators#accessors-and-mutators
BEARBEITEN: Da Ihr Attribut "virtuell" ist, ist es standardmäßig nicht in der JSON-Darstellung Ihres Objekts enthalten.
Aber ich habe folgendes gefunden: Benutzerdefinierte Modell-Accessoren werden nicht verarbeitet, wenn -> toJson () aufgerufen wird?
Um die Rückgabe Ihres Attributs im Array zu erzwingen, fügen Sie es als Schlüssel zum Array $ attribute hinzu.
Ich habe es nicht getestet, sollte aber für Sie ziemlich trivial sein, um es in Ihrem aktuellen Setup zu versuchen.
quelle
->available
für das$session
Objekt verfügbar ist.$sessions
Da es jedoch direkt in eine JSON-Zeichenfolge konvertiert wird (es ist Teil einer API), besteht keine Möglichkeit, dies zu verwenden.EventSession::all()
ein JSON-Objekt von einer API zurückgeben, verwenden Sie nicht wirklich ein Laravel-Modell, oder? Entschuldigung, ich bin verwirrt darüber, wie Sie Ihr Modell implementiert haben.class EventSession extends Eloquent
).::all()
ist nur als Beispiel.EventSession::find(170071)
wäre ein anderer. Diese werden an verschiedenen Stellen in SessionController (SessionController extends \BaseController
) aufgerufen, die über URLs wie '/ session / 170071' aufgerufen werden.public $available
dem Modell ein benutzerdefiniertes Attribut hinzufügen , wird dieses beim Konvertieren des Objekts nicht angezeigt.protected $appends = array('is_admin');
)Ich hatte etwas Ähnliches: Ich habe ein Attributbild in meinem Modell, das den Speicherort der Datei im Speicherordner enthält. Das Bild muss base64-codiert zurückgegeben werden
quelle
Sie können die
setAttribute
Funktion in Model verwenden, um ein benutzerdefiniertes Attribut hinzuzufügenquelle
Angenommen, Sie haben 2 Spalten mit den Namen Vorname und Nachname in Ihrer Benutzertabelle und möchten den vollständigen Namen abrufen. Sie können mit dem folgenden Code erreichen:
Jetzt können Sie den vollständigen Namen erhalten als:
quelle
Schritt 1: Definieren Sie Attribute in
$appends
Schritt 2: Definieren Sie den Accessor für diese Attribute.
Beispiel:
quelle
In meinem Abonnementmodell muss ich wissen, dass das Abonnement angehalten ist oder nicht. Hier ist, wie ich es gemacht habe
Dann kann ich in der Ansichtsvorlage
$subscription->is_paused
das Ergebnis abrufen.Das
getIsPausedAttribute
ist das Format zum Festlegen eines benutzerdefinierten Attributs.und verwendet
is_paused
, um das Attribut in Ihrer Ansicht abzurufen oder zu verwenden.quelle
In meinem Fall hat das Erstellen einer leeren Spalte und das Festlegen des Accessors einwandfrei funktioniert. Mein Accessor füllt das Alter des Benutzers aus der Dob-Spalte. Die Funktion toArray () funktionierte ebenfalls.
quelle