雄辩的 ORM 和 EAV

Posted

技术标签:

【中文标题】雄辩的 ORM 和 EAV【英文标题】:Eloquent ORM and EAV 【发布时间】:2013-06-19 20:30:12 【问题描述】:

我将开发一个使用 EAV 结构来存储对象数据的系统。模型本身会有一些预定义的属性(坐标和日期/时间戳),即:

X 是的 Z 开始日期/时间 结束日期/时间

其余属性将由用户动态创建,并作为行添加到属性表中。这些行将被旋转并用作与值表对齐的列(不确定这是否需要解释,但认为比抱歉更安全)。

对象(或实体)与属性的关系是一对多的。

属性与值的关系是一对多的。

我是 Eloquent/Laravel 的新手,但我已经阅读了关系文档,发现有一对多关系的功能,但是,我不清楚如何引用 EAV 中的所有数据(似乎更多面向 RDBMS)。会是这样吗(请记住,这是一个粗略的例子)?

class UserObject extends Eloquent 

    public function object_data()
    
        return $this->hasMany(attributes_data);
    

    public function attributes_data()
    
        return $this->hasMany('Values');
    


基本上,我的问题是:

在检索与 EAV 关联的所有数据时,是否有一种公认的(或适当的)方法来设计/编写模型?如果是这样,您能否指出一些有关 Eloquent/EAV 方法的文档或教程?

一些事后的想法:

我的想法是,我需要为 EAV 的每个组件创建 3 个类(即,一个用于实体组件数据,一个用于属性数据,一个用于值数据)。

谢谢。

【问题讨论】:

【参考方案1】:

有几种方法可以解决这个问题(正如我通过其他论坛帖子发现的那样):

为每个 EAV 组件创建一个模型,例如伪代码:

class Object extends Eloquent
    public function objects()
        return $this->hasMany('Attribute');
    


class Attribute extends Eloquent
    public function attributes()
        return $this->hasMany('Value');
    


class Value extends Eloquent
    public function values()
        return /* etc. */;
    

这将导致性能下降,因为将执行 3 个查询来检索值数据。

使用查询生成器

select()->join()->where("attribute", "=", "something")

这也会导致性能下降。

Laravel 的数据库功能

基本上直接运行 SQL 查询可能会导致最少的开销,例如来自 Laravel 站点:

 $results = DB::select('select * from users where id = ?', array(1));

旁注:

对于这种系统(属性是动态且未知的),最好完全避免 EAV 并坚持使用 No-SQL 解决方案,这样使用 Laravel 会更直观。我已经考虑过这个选项,并将长期坚持下去。

【讨论】:

您好,您能详细解释一下 NO SQL 解决方案吗?因为我也有同样的情况,并考虑将 EAV 用于我的数据库!我会有公司,他们的功能都是使用 EAV 绑定的。搜索标签、类别等也是如此 @MikelBitson 通过“无 SQL”,quandrei 一定是指像“MongoDB”这样的解决方案,但是也可以使用 mysql 中的 JSON 编码列。

以上是关于雄辩的 ORM 和 EAV的主要内容,如果未能解决你的问题,请参考以下文章

雄辩的 ORM 交叉搜索

laravel 4 - 如何限制(采取和跳过)雄辩的 ORM?

PhpStorm 中雄辩的 ORM 代码提示

雄辩的 ORM 查询——新手

Laravel 雄辩的 ORM 关系

我可以在一个地方(一个模型)使用雄辩的ORM和查询生成器吗?