Eloquente - Richiamata quando il recupero del modello è completo
Domanda
Ho un modello 'Page' 'che ha un "PageCustomfield" di una relazione one-to-molti (come il concetto di wordpress di un campo personalizzato).
Questo modello di campo personalizzato ha due campi, chiave e valore. Quello che vorrei fare è essere in grado di fare qualcosa come il seguente in un modello di ramoscello, dove page
è il modello di pagina dei genitori, custom
è la raccolta di campi personalizzati e email
è il tasto per interrogare relazioni sul campo L'uscita sarebbe il campo value
del modello PageCustomField.
{{ page.custom.email }}
.
L'ho raggiunto aggiungendo quanto segue al modello di pagina:
public $custom = array();
public function extractCustomFields()
{
foreach ($this->customFields as $customField) {
$this->custom[$customField->key] = $customField->value;
}
return $this;
}
.
chiamato come segue:
$page = Page::where('slug', 'home')->firstOrFail()->extractCustomFields();
.
Quello che preferirei sarebbe avere un callback che ha fatto questo automaticamente, comunque, come nel metodo di avvio statico. Qualcosa come ...
public static function boot()
{
parent::boot();
// Extract PageCustomField relations into 'custom' array
static::fetched(function($model) {
$model->extractCustomFields();
});
}
.
Guardando attraverso i metodi di illuminazione \ database \ eloquent \ model, non sono riuscito a vedere un callback che lo raggiungerà, ma può essere fatto? Potrei scavalcare il metodo firstOrFail()
, ma preferirei no.
Soluzione
Credo che potresti usare un Accessor per questo caso.
protected $customFields = [
'email' = 'foo@bar.com'
];
public function getCustomAttribute() {
return $this->customFields; // array
//return (object)$this->customFields; // object
}
.
Chiamalo:
$user = MyClass::find(1);
echo $user->custom['email']; // array
//echo $user->custom->email; // object
.