Eloquent - обратный вызов по завершении выборки модели

StackOverflow https://stackoverflow.com//questions/25014976

Вопрос

У меня есть модель "Страница", которая имеет отношение "один ко многим" "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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top