Eloquent - Rückruf, wenn der Modellabruf abgeschlossen ist
Frage
Ich habe eine Modellseite mit einer Eins-zu-Viele-Beziehung 'PageCustomField' (wie das WordPress-Konzept eines benutzerdefinierten Felds).
Dieses benutzerdefinierte Feldmodell enthält zwei Felder, Schlüssel und Wert.Was ich tun möchte, ist in der Lage zu sein, in einer Zweigvorlage so etwas wie das Folgende zu tun, wobei page
ist das übergeordnete Seitenmodell, custom
ist die Sammlung von benutzerdefinierten Feldern und email
ist der Schlüssel um benutzerdefinierte Feldbeziehungen abzufragen.Die Ausgabe wäre die value
feld des PageCustomField-Modells.
{{ page.custom.email }}
Ich habe dies erreicht, indem ich dem Seitenmodell Folgendes hinzugefügt habe:
public $custom = array();
public function extractCustomFields()
{
foreach ($this->customFields as $customField) {
$this->custom[$customField->key] = $customField->value;
}
return $this;
}
Wie folgt aufgerufen:
$page = Page::where('slug', 'home')->firstOrFail()->extractCustomFields();
Was ich bevorzugen würde, wäre ein Rückruf, der dies jedoch automatisch ausführt, beispielsweise bei der statischen Startmethode.So etwas wie...
public static function boot()
{
parent::boot();
// Extract PageCustomField relations into 'custom' array
static::fetched(function($model) {
$model->extractCustomFields();
});
}
Beim Durchsuchen der Methoden Illuminate \ Database \ Eloquent \ Model konnte ich keinen Rückruf sehen, der dies erreichen würde, aber kann es getan werden?Ich könnte das überschreiben firstOrFail()
methode, würde aber lieber nicht.
Lösung
Ich glaube, du könntest einen gebrauchen Accessor für diesen Fall.
protected $customFields = [
'email' = 'foo@bar.com'
];
public function getCustomAttribute() {
return $this->customFields; // array
//return (object)$this->customFields; // object
}
Nennen Sie es:
$user = MyClass::find(1);
echo $user->custom['email']; // array
//echo $user->custom->email; // object