我开发了一个系统,其中各种类具有由自定义公式组成的属性。公式可以包含引用不同类型对象的特殊标记。例如,FruitSalad类的对象可能具有以下属性;
$contents = "[A12] + [B76]";
在某种抽象的术语中,这意味着"将苹果12添加到香蕉76"。它也可能比一个公式中涉及的其他对象多达15或20个引用复杂得多。
我有一个特性传递这样的公式,每当它找到对模型的引用时(即" [A12]")它从A :: find(12)数据库中获取它并将其添加到组件对象数组中,以后可以在请求中用于其他进程。
因此,从本质上讲,它是一种关系。但是,不是使用数据透视表来描述关系,父模型上有一个公式,可以包含对子模型的引用。
这一切都有效。好极了!但它的效率非常低,因为在解析公式时,有很多微小的查询可以获得单个模型。一个请求可能很容易导致数百个查询。糟糕。
我看到两个可能的选择; 1.在请求开始时从数据库中获取所有我的苹果和香蕉,并在解析公式时从内存存储而不是数据库中获取它们(这是存储库模式吗?)。 2.创建一个自定义关系类型(类似于hasManyFromFormula),这使得急切加载工作变得更加简单,因为相关的苹果和香蕉已经被加载到父模型中。
这有先例吗?至于为什么我这样做,简单解释会有点困难,但足以说它是支持高度可配置的数据检索系统,它支持尚未知的输入数据配置。
帮助!
谢谢, 杰夫
答案 0 :(得分:0)
我不完全确定它是否是最佳解决方案,但最后我为基本组件创建了一个新的目录类,然后在app服务提供程序中将其设置为单例。目录类的构造函数加载了几个相关类的所有模型,并使它们在整个应用程序中作为集合提供。