Eloquent - обратный вызов по завершении выборки модели
Вопрос
У меня есть модель "Страница", которая имеет отношение "один ко многим" "PageCustomField" (например, концепция пользовательского поля в WordPress).
Эта пользовательская модель поля содержит два поля: ключ и значение.Что я хотел бы сделать, так это иметь возможность сделать что-то вроде следующего в шаблоне Twig, где page
является моделью родительской страницы, custom
представляет собой набор пользовательских полей и email
это ключ для запроса пользовательских связей полей.Результатом будет следующий value
поле модели PageCustomField.
{{ page.custom.email }}
Я добился этого, добавив следующее в модель страницы:
public $custom = array();
public function extractCustomFields()
{
foreach ($this->customFields as $customField) {
$this->custom[$customField->key] = $customField->value;
}
return $this;
}
Вызывается следующим образом:
$page = Page::where('slug', 'home')->firstOrFail()->extractCustomFields();
Однако я бы предпочел, чтобы обратный вызов выполнял это автоматически, например, в методе статической загрузки.Что-то вроде...
public static function boot()
{
parent::boot();
// Extract PageCustomField relations into 'custom' array
static::fetched(function($model) {
$model->extractCustomFields();
});
}
Просматривая методы Illuminate\Database\Eloquent\Model, я не смог увидеть обратного вызова, который позволил бы достичь этого, но можно ли это сделать?Я мог бы переопределить firstOrFail()
метод, но предпочел бы этого не делать.
Решение
Я полагаю, вам не помешал бы средство доступа для этого случая.
protected $customFields = [
'email' = 'foo@bar.com'
];
public function getCustomAttribute() {
return $this->customFields; // array
//return (object)$this->customFields; // object
}
Назови это:
$user = MyClass::find(1);
echo $user->custom['email']; // array
//echo $user->custom->email; // object