doctrine - 单行表中的单表继承

时间:2014-12-28 11:23:55

标签: symfony inheritance doctrine-orm

我想要做的是创建一个人可以拥有的角色层次。并使用Doctrine和Symfony2执行此操作。

层次结构的顶部是 person 。从人的角度来看,有一个名为employee的子类和两个名为 it_user telephony_user 的子类。其中每一个都向基类人员添加了几个属性。

如果我理解正确,使用单表继承,对于同一个人,我会有不同的行(一个是rol / subclass)。

我想为同一个人创建相同的行,并使用每个类/子类管理属性的某个子集。

问题:

单表继承是一个很好的方法吗?任何调整?

或者更好的是一个名为person的超类的经典方式,它具有所有角色的所有属性的聚合?

其他任何方式都更好吗?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果您计划根据人员类型设置不同的属性,则应使用 Class Table Inheritance。此继承允许您进行以下操作:

超类:

Person
- name
- gender

子类1:

Employ extends Person
- manager
- projects

子类2:

TelephonyUser extends Person
- schedule
- foo
- bar

通过这种方式,每个模型(子类)都映射到其表。了解每个子类如何相互具有自定义属性并同时共享父属性。

单表继承(STI)和聚合

查看以下数据库模式:

-- Uploads table
id  |  name    | size   |  type  |  filename 
------------------------------------------ 
1   | upload1  | 43423  |  image | foo.gif
2   | upload2  | 64234  |  file  | hack.txt
3   | upload3  | 76646  |  image | bar.gif
根据类型列

文件图片上传类的两个子类。如您所见,它们都具有相同的属性,可以处理子类类型。为什么?因为这种继承是基于行为模型而不是结构的明智之举。例如,您可以为每个类不同地管理属性数据:

// In file class the content as text should be showen
class File extends Uploads{

    // show the file content
    public function show(){
        echo file_get_contents( $this->filename );
    }
}

// In Image class the image should be showen
class File extends Uploads{

    // show the file content
    public function show(){
        echo "<img src='{ $this->filename }' alt='' />";
    }
}

了解每个具有相同属性的类如何管理它们彼此不同。但最相关的是所有数据都将存储在unique table中。因此,您需要做的是为db squema建模以应用适当的继承。