orm - Eloquent ORM 和 EAV

标签 orm entity-attribute-value eloquent

我将在一个系统上工作,该系统将使用 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 个类(即,一个用于实体组件数据,一个用于属性数据,一个用于值数据)。

谢谢。

最佳答案

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

为每个 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("属性", "=", "某事")

这也会导致性能下降。

Laravel 的数据库特性

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

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

旁注:

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

关于orm - Eloquent ORM 和 EAV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17200701/

相关文章:

php - 为房地产 php 应用程序设计数据库,表中的列太多

php - Laravel 获取关系或所有对象

python - 单个表上的 SQLAlchemy 多对多关系

orm - 如何使用 dapper orm 执行批处理操作?

mysql - EAV是 'bad',但是类表继承的可维护性如何呢?

php - 阐明如何在 Laravel 的 Eloquent ORM 中设置一对多关系

php - Laravel 负载与模型条件的关系

java - JPA 和 JDO 规范有什么区别?

python - 如何获取对象的字段?

mysql - 为什么这个 "Mysql"查询偶尔会挂起一次?