【问题标题】:Laravel / Eloquent special relation type based on parsed string attribute基于解析字符串属性的 Laravel / Eloquent 特殊关系类型
【发布时间】:2016-11-25 09:49:46
【问题描述】:

我开发了一个系统,其中各种类具有由自定义公式组成的属性。该公式可以包含引用不同类型对象的特殊标记。例如 FruitSalad 类的对象可能具有以下属性;

$contents = "[A12] + [B76]";

在有些抽象的术语中,这意味着“将苹果 12 添加到香蕉 76”。与在一个公式中涉及多达 15 或 20 个对其他对象的引用相比,它也可能变得更加复杂。

我有一个特征可以传递这样的公式,每次它找到对模型的引用(即“[A12]”)时,它都会使用 A::find(12) 从数据库中获取它并将其添加到组件对象数组,可用于稍后在请求中的其他进程。

所以,本质上,这是一种关系。但不是使用数据透视表来描述关系,而是在父模型上有一个公式,其中可以包含对子模型的引用。

这一切正常。耶!但这确实效率低下,因为在解析公式时有太多微小的查询来获取单个模型。一个请求可能很容易导致数百个查询。哎呀。

我看到了两个潜在的选择; 1. 在请求开始时从数据库中获取我所有的苹果和香蕉,并在解析公式时从内存存储而不是从数据库中获取它们(这是存储库模式吗??)。 2. 创建一个自定义关系类型(类似于 hasManyFromFormula),它可以使预加载工作,从而使解析变得更加简单,因为相关的苹果和香蕉已经加载到父模型中。

这有先例吗?至于我为什么要这样做,简要解释起来有点困难,但只要说它支持一个高度可配置的数据检索系统就足够了,它支持未知的输入数据配置。

帮助!

谢谢, 杰夫

【问题讨论】:

    标签: laravel laravel-5 eloquent relationship


    【解决方案1】:

    我不完全确定这是否是最佳解决方案,但最后我为基本组件创建了一个新目录类,然后在应用服务提供者中将其设置为单例。目录类的构造函数加载了几个相关类的所有模型,并使它们在整个应用程序中作为集合可用。

    【讨论】:

      猜你喜欢
      • 2020-01-29
      • 2016-05-01
      • 1970-01-01
      • 2021-09-12
      • 2017-07-16
      • 2023-03-28
      • 2011-04-11
      • 1970-01-01
      • 2015-03-22
      相关资源
      最近更新 更多