Eloquent - retorno de chamada quando a busca do modelo for concluída
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.
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