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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top