Eloquent - 模型提取完成时的回调

时间:2014-07-29 12:10:58

标签: php laravel laravel-4 eloquent

我有一个模型'Page',它有一对多关系'PageCustomField'(就像自定义字段的WordPress概念)。

此自定义字段模型有两个字段,键和值。我想做的是能够在Twig模板中执行以下操作,其中page是父页面模型,custom是自定义字段的集合,email用于查询自定义字段关系。输出将是PageCustomField模型的value字段。

{{ 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()方法,但不愿意。

1 个答案:

答案 0 :(得分:1)

我相信你可以在这种情况下使用accessor

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