Eloquent - rappel lorsque la récupération du modèle est terminée
Question
J'ai un modèle « Page » qui a une relation un-à-plusieurs « PageCustomField » (comme le concept WordPress de champ personnalisé).
Ce modèle de champ personnalisé comporte deux champs, clé et valeur.Ce que j'aimerais faire, c'est pouvoir faire quelque chose comme ce qui suit dans un modèle Twig, où page
est le modèle de page parent, custom
est la collection de champs personnalisés et email
est le clé pour interroger les relations de champs personnalisées.Le résultat serait le value
champ du modèle PageCustomField.
{{ page.custom.email }}
J'y suis parvenu en ajoutant ce qui suit au modèle de page :
public $custom = array();
public function extractCustomFields()
{
foreach ($this->customFields as $customField) {
$this->custom[$customField->key] = $customField->value;
}
return $this;
}
Appelé comme suit :
$page = Page::where('slug', 'home')->firstOrFail()->extractCustomFields();
Ce que je préférerais, ce serait d'avoir un rappel qui le ferait automatiquement, comme dans la méthode de démarrage statique.Quelque chose comme...
public static function boot()
{
parent::boot();
// Extract PageCustomField relations into 'custom' array
static::fetched(function($model) {
$model->extractCustomFields();
});
}
En parcourant les méthodes Illuminate\Database\Eloquent\Model, je n'ai pas pu voir de rappel qui permettrait d'atteindre cet objectif, mais est-ce possible ?Je pourrais remplacer le firstOrFail()
méthode, mais je préférerais ne pas le faire.
La solution
Je crois que tu pourrais utiliser un accesseur pour ce cas.
protected $customFields = [
'email' = 'foo@bar.com'
];
public function getCustomAttribute() {
return $this->customFields; // array
//return (object)$this->customFields; // object
}
Appeler:
$user = MyClass::find(1);
echo $user->custom['email']; // array
//echo $user->custom->email; // object