Pregunta

Tengo un modelo de 'Página', que tiene una relación de uno a muchos relación 'PageCustomField' (como el de WordPress concepto de un campo personalizado).

Este campo personalizado modelo tiene dos campos, una clave y un valor.Lo que me gustaría hacer es ser capaz de hacer algo como lo siguiente en una Rama de la plantilla, donde page es la Página principal modelo, custom es la colección de campos personalizados y email es el clave para consultas personalizadas campo de relaciones.La salida sería el value campo de la PageCustomField modelo.

{{ page.custom.email }}

He logrado esto mediante la adición de la siguiente para el modelo de Página:

public $custom = array();

public function extractCustomFields()
{
     foreach ($this->customFields as $customField) {
        $this->custom[$customField->key] = $customField->value;
     }

     return $this;
}

Se llama de la siguiente manera:

$page = Page::where('slug', 'home')->firstOrFail()->extractCustomFields();

Lo que me gustaría sería tener una devolución de llamada que hizo esto de forma automática, sin embargo, como en la estática método de arranque.Algo así como...

public static function boot()
{
    parent::boot();

    // Extract PageCustomField relations into 'custom' array    
    static::fetched(function($model) {
        $model->extractCustomFields();
    });
}

Mirando a través de los Illuminate\bases de datos\Elocuente\métodos de Modelo, yo no podía ver una devolución de llamada que iba a lograrlo, pero ¿se puede hacer?Yo podría anular la firstOrFail() método, sino que más bien no.

¿Fue útil?

Solución

Creo que se podría utilizar un descriptor de acceso para este caso.

protected $customFields = [
    'email' = 'foo@bar.com'
];

public function getCustomAttribute() {
    return $this->customFields; // array
    //return (object)$this->customFields; // object
}

Lo llame:

$user = MyClass::find(1);

echo $user->custom['email']; // array
//echo $user->custom->email; // object
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top