php - Doctrine2,映射 "inherited"表

标签 php mysql orm doctrine-orm data-mapping

正如此处指出的:Doctrine 2.1 - Map entity to multiple tables 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 表,我不得不问:

  1. 这是糟糕的设计吗?我是否忽略了其他一些优雅地解决这个问题的方法?我知道其他 DMBS 具有继承性,但例如 PostgreSql 仍然不允许我加入 base_entity 以说明是否不存在子实体的物理 base_entity。

  2. 我可以在代码方面做这样的事情:

    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.ok 中的方法是好的,还是有更好的方法来处理这个问题),是否有允许多表映射的 ORM?

非常感谢。

最佳答案

您可以使用类表继承 (see Doctrine documentation about that),定义一个 BaseEntity 实体类,然后创建扩展它的 EntityOne 和 EntityTwo。 您可以将 BaseEntity 类和 State 实体类之间的关系定义为一对多关联 - 如果我理解您想要的是什么,请在 BaseEntity 类中提供所需的 getState() 方法。

像这样:

/**
 * @Entity
 * @Table(name="base_entity")
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="entity_type", type="string")
 * @DiscriminatorMap({"entity_one"="EntityOne", "entity_two"="EntityTwo"})
 */
class BaseEntity {

    /**
     * @Id
     * @Column(type="integer")
     */
    protected $id;

    /**
     * @OneToMany(targetEntity="State", mappedBy="entity)
     **/
    protected $states;

    public function getStates() {
        return $this->states;
    }

    ...
}

/**
 * @Entity
 * @Table(name="entity_one")
 */
class EntityOne extends BaseEntity {

    ...
}

/**
 * @Entity
 * @Table(name="entity_two")
 */
class EntityTwo extends BaseEntity {

    ...
}

/**
 * @Entity
 * @Table(name="state")
 */
class State {

    /**
     * @ManyToOne(targetEntity="BaseEntity", inversedBy="states")
     * @JoinColum(name="entity_id", referencedColumnName="id")
     */
    protected $entity;

    public function getEntity() {
        return $this->entity;
    }

    ...
}

关于php - Doctrine2,映射 "inherited"表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10228116/

相关文章:

java - JPA xml 映射找不到字段

php - SHA-256 是否不区分大小写?

php - 在自定义管理页面上提交表单 (Wordpress)

mysql - 无法在 Windows 10 上的 MySQL 8.x 中设置 lower_case_table_names

mysql - 按一个字段分组并将所有其他字段放在 SQL 行中的高效查询

php - 我们可以使用 odbc_connect 通过任何可用的 ORM 为 laravel 应用程序获取数据吗

python - 如何在sqlalchemy中指定表的填充因子?

php - 使用已知的用户名和密码登录 Facebook API

javascript - 使用 Jquery 和 AJAX 进行表单验证

php - 服务器负载均衡器算法