【问题标题】:How to lazy load a custom attribute on a Laravel model?如何在 Laravel 模型上延迟加载自定义属性?
【发布时间】:2017-02-20 04:51:24
【问题描述】:

是否有任何可能的方法来延迟加载 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;

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

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    这样的事情应该可以工作......

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 嘿,谢谢,这正是我想要的!我很高兴 Laravel 有一种原生的方式来处理这个问题。我认为他们只在文档中提到appends(而不是单数append),这就是我从未听说过这个的原因。
      • 有很多我不知道的很酷的方法。深入研究模型代码非常有启发性,我强烈推荐您使用它来找到很棒的工具:)
      • 这不像描述的那样工作。 append() 方法属于 Model 类,但是当您调用 MyModel::all() 时,您将返回一个不包含 append() 方法的 Collection 对象。你必须写:$model->each(function($instance) { $instance->append('foo'); });
      • 每次我在堆栈上找到答案时,我也会尝试在文档中找到答案,因此我在阅读文档时获得了更好的技能。对于这件事,我在这里找到了答案laravel.com/api/8.x/Illuminate/Database/Eloquent/…
      猜你喜欢
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 2013-06-18
      • 2017-03-31
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多