正如这里所指出的:Doctrine 2.1 - 将实体映射到多个表Doctrine2 不允许将一个对象映射到多个表。
我目前有一个类似于此的 Mysql 数据库设置:
base_entity: id, some_basic_data_columns
state: id, state, entity_id (FK to base_entity.id), start_time, end_time, ...
entity_one: id (FK to base_entity.id), some_specific_data
entity_two: id (FK to base_entity.id), some_specific_data
and so on...
在某种程度上,entity_x 是“扩展”base_entity,所有这些实体都可以有多个状态。要拥有正确的外键,我必须要么有单独的状态表(我不想这样做,因为它们在结构上是相同的),或者这样做。
基础实体本身是无用的,id 甚至可以归结为 id 字段,以允许与每个子实体连接到多个状态。
我不需要 BaseEntity 类,但我确实需要每个子实体都有一个 getStates() 方法。当然,我实际上可能有一个抽象实体类,但具体实体会扩展它,而不是像我将它们映射为映射其他一对一关系时那样将其作为属性
由于 Doctrine 不允许我将 EntityOne 映射到 entity_one 和 base_entity 表,我不得不问:
这是糟糕的设计吗?我是否忽略了其他一些优雅地解决这个问题的方法?我知道其他 DMBS 具有继承性,但例如 PostgreSql 仍然不允许我加入 base_entity 来说明是否不存在孩子的物理 base_entity。
我可以在代码方面做这样的事情:
class EntityOne { // baseEntity as a property private $_baseEntity; // private getter for the base table private getBaseEntity(); // and getters like this for properties in the base table public getStates(){ return $this->getBaseEntity()->getStates(); } }
这样,实体对于外部世界的行为就像单个实体(不是从基类和子类组合),但它仍然需要我编写一个单独的 BaseEntity 类和所有配置信息以将其连接到其他实体类
基本上,我要问的是:这是一个 Db 设计问题,我从一开始就完全错了(如果我这样做了,这是“最好”的方法),还是这是一个代码问题,我应该用代码解决它(如果是这样,我在 2. 中的方法是好的,还是有更好的方法来处理这个问题),是否有允许多个表映射的 ORM?
提前谢谢了。