基于解析字符串属性的Laravel / Eloquent特殊关系类型

时间:2016-11-25 09:49:46

标签: laravel laravel-5 eloquent relationship

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

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

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

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

因此,从本质上讲,它是一种关系。但是,不是使用数据透视表来描述关系,父模型上有一个公式,可以包含对子模型的引用。

这一切都有效。好极了!但它的效率非常低,因为在解析公式时,有很多微小的查询可以获得单个模型。一个请求可能很容易导致数百个查询。糟糕。

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

这有先例吗?至于为什么我这样做,简单解释会有点困难,但足以说它是支持高度可配置的数据检索系统,它支持尚未知的输入数据配置。

帮助!

谢谢, 杰夫

1 个答案:

答案 0 :(得分:0)

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