当前位置: 首页 > 知识库问答 >
问题:

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

段干安和
2023-03-14

有没有可能通过使用appends属性在Laravel模型上延迟加载自定义属性,而不必每次都加载它?我正在寻找一种类似于你们可以懒散地加载雄辩的关系的方式。

例如,给定模型上的这个访问器方法:

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

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

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

这个问题与在加载时向Laravel/Elount模型添加自定义属性不同吗?因为它希望在每次模型加载时加载一个自定义属性,所以我希望仅在指定时延迟加载该属性。

我想我可以为模型实例分配一个与自定义属性同名的属性,但这会导致性能下降,即调用两次访问器方法,如果访问器影响类属性,并且感觉脏,则可能会产生意外的副作用。

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

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

共有2个答案

公孙新觉
2023-03-14

像这样的东西应该有用。。。

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

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

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

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

 类似资料:
  • 问题内容: 我希望能够在加载Laravel / Eloquent模型时为其添加自定义属性/属性,类似于使用RedBean的 方法可以实现的那样。 例如,目前,在我的控制器中,我有: 能够省略循环并已经设置并填充了“ available”属性将是很好的选择。 我尝试使用文档中描述的一些模型事件在对象加载时附加此属性,但到目前为止还没有成功。 笔记: “可用”不是基础表中的字段。 是作为JSON对象作

  • 在自定义img标签上是否有触发Wordpress 5.5延迟加载功能的方法? 本文提到“默认情况下,WordPress将向所有具有宽度和高度属性的img标记添加load=“lazy” 当我尝试通过wp_get_attachment_image()添加图像时,它确实添加了load=“lazy”和srcset属性,但是当我尝试添加带有宽度和高度设置的普通img标记时,这些属性没有被添加。是否需要另外设

  • 我目前面临的问题是如何处理聚合中实体之间的关联。 考虑以下示例: 现在,我们有一个,User“实体,也是我的聚合根。他可以有一个,Product”和多个,别名。我现在需要的是检索相关的,Product和,,域模型中的“按需别名”。用户由UserFactory创建,当从持久性数据创建实体时,可以单独使用,也可以在UserRepository中使用。 这样做的原因是因为我们的业务逻辑(如您在示例中看到

  • 问题内容: 我正在尝试把我的头围住Swift语言。使用Objective-C在代码中构建视图时,常见的模式是覆盖UI属性并像这样延迟加载它们: 这允许将UIElement的配置包含在其设置中,但是不会导致每次都对其进行重新配置。 看来我们无权访问Swift中的后备存储,并且关键字实际上没有相同的语义。 我很好奇是否有人在Swift中找到了类似的模式,该模式允许人们以一种简洁的语法方式将变量和常量的

  • 问题内容: foo类有一个酒吧。除非访问,否则不会加载钢筋。进一步访问bar应该不会产生任何开销。 是否可以使用属性或更好的属性来执行类似的操作,而不是使用getter方法? 目标是在所有后续访问中无负载地延迟加载… 问题答案: 当前的答案存在一些问题。具有属性的解决方案要求您指定其他类属性,并且在每次查找时都要检查该属性。该解决方案的问题在于,它会隐藏该属性,直到首次访问。这不利于自省,并且不便

  • 我试图使用jQuery懒惰加载在我的Laravel/Vue项目,但我正在努力让图像出现在我的Vue组件。我有以下img块,我认为会工作: 我确实在这里发现了另一个问题-Vue.js模板中的静态图像src-但是当我尝试该方法时,我得到了这样的结果: 因此,我切换回v-bind方法,但我得到的只是一个带有灰色边框的白色框-没有图像。但是,如果我在src属性上使用v-bind,我可以正确地看到图像。 我