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

And*_*ker 8 php laravel laravel-5

是否有任何可能的方式来延迟加载在Laravel模型的自定义属性,而不使用每次加载它appends的财产?我正在寻找类似于你可以懒惰加载雄辩关系的方式.

例如,在模型上给定此访问器方法:

public function getFooAttribute(){
    return 'bar';
}
Run Code Online (Sandbox Code Playgroud)

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

$model = MyModel::all();
$model->loadAttribute('foo');
Run Code Online (Sandbox Code Playgroud)

这个问题是一样的事情的自定义属性添加到负载的Laravel /雄辩的模式?因为它想在每个模型加载上加载自定义属性 - 我希望仅在指定时延迟加载属性.

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

$model = MyModel::all();
$model->foo = $model->foo;
Run Code Online (Sandbox Code Playgroud)

有没有人有更好的方法处理这个?

Ham*_*bot 14

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

$model = MyModel::all();
$model->append('foo');
Run Code Online (Sandbox Code Playgroud)

append方法还可以将数组作为参数.

  • 这不像描述的那样工作。`append()` 方法属于 `Model` 类,但是当你调用 `MyModel::all()` 时,你会得到一个 `Collection` 对象,它不包含 `append()` 方法。你必须写:`$model->each(function($instance) { $instance->append('foo'); });` (4认同)
  • 每当我在堆栈上找到答案时,我也会尝试在文档中找到答案,因此我在浏览文档方面获得了更好的技能。对于这个问题,我在这里找到了答案https://laravel.com/api/8.x/Illuminate/Database/Eloquent/Collection.html#method_append (2认同)