Pergunta

Eu tenho um modelo 'Page' que tem uma relação um-para-muitos 'PageCustomField' (como o conceito WordPress de um campo personalizado).

Este modelo de campo personalizado possui dois campos, chave e valor.O que eu gostaria de fazer é algo como o seguinte em um modelo Twig, onde page é o modelo da página pai, custom é a coleção de campos personalizados e email é o chave para consultar relações de campos personalizados.A saída seria a value campo do modelo PageCustomField.

{{ page.custom.email }}

Consegui isso adicionando o seguinte ao modelo de página:

public $custom = array();

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

     return $this;
}

Chamado da seguinte forma:

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

O que eu preferiria seria ter um retorno de chamada que fizesse isso automaticamente, como no método de inicialização estático.Algo como...

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

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

Examinando os métodos Illuminate\Database\Eloquent\Model, não consegui ver um retorno de chamada que conseguisse isso, mas isso pode ser feito?Eu poderia substituir o firstOrFail() método, mas preferiria não.

Foi útil?

Solução

Eu acredito que você poderia usar um acessador para este caso.

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

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

Chame-o:

$user = MyClass::find(1);

echo $user->custom['email']; // array
//echo $user->custom->email; // object
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top