如何在Laravel模型上延迟加载自定义属性?

时间:2016-10-11 15:18:32

标签: php laravel laravel-5

是否有任何可能的方法在Laravel模型上延迟加载自定义属性,而不是每次使用appends属性加载它?我正在寻找类似于lazy load Eloquent relationships的方式。

例如,在模型上给出这种访问器方法:

public function getFooAttribute(){
    return 'bar';
}

我希望能够做到这样的事情:

$model = MyModel::all();
$model->loadAttribute('foo');

这个问题Add a custom attribute to a Laravel / Eloquent model on load?相同,因为它想要在每个模型加载上加载自定义属性 - 我希望延迟加载属性仅在指定时。

我想我可以使用与自定义属性相同的名称为模型实例分配属性,但这具有调用访问器方法两次的性能缺点,可能会产生意外的副作用访问器会影响类属性,只是感觉很脏。

$model = MyModel::all();
$model->foo = $model->foo;

有没有人有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:13)

这是序列化吗?您可以在Model实例上使用append()方法:

$model = MyModel::all();
$model->append('foo');

append方法也可以将数组作为参数。

答案 1 :(得分:0)

这样的事情应该有用......

public function loadAttribute($name) {
    $method = sprintf('get%sAttribute', ucwords($name));
    $this->attributes[$name] = $this->$method();
}