在Doctrine 2中跨多个数据库表实现类表继承(CTI)

时间:2011-04-06 12:45:46

标签: mysql inheritance doctrine-orm mysql-error-1146

需要一些帮助吗?

我有2个类,一个Parent类,比如Person和一个Child说Employee使用Doctrine 2的类表继承映射策略。类的相应表存在于单独的数据库表中:Person表存在于数据库中:dbOne和Employee表位于dbTwo中。

这些课程如下:

/**
 * @Entity
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="discr", type="string")
 * @DiscriminatorMap({"person" = "Person", "employee" = "Employee"})
 * @Table(name="Person")
 */
class Person
{

和子类

/**
 * @Entity
 * @Table(name="Employee")
 */
class Employee extends Person
{

Employee表的架构如下所示:

CREATE TABLE Employee (
    id INT NOT NULL,
    department VARCHAR(50) NOT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;
ALTER TABLE Employee ADD FOREIGN KEY (id) REFERENCES **dbOne.Person**(id) ON DELETE CASCADE

实际上有两个问题。

  1. 由于Doctrine为每个数据库映射一个实体管理器,如果我调用
  2. $这 - > entityManager->冲洗();

    在Person对象上,它标记错误:

    Message: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'dbOne.Employee' doesn't exist 
    

    如果我调用实体管理器(对于dbTwo)来保存Employee对象,则反之亦然。 当表位于同一数据库中时,不存在该问题。我该如何解决这个问题?另外,如何检索实体管理器在flush()操作期间使用的SQL查询?知道生成和使用什么SQL会很有帮助 - 比如:

    $this->entityManager->getQuery(); //显然这只是为了解释我的意思

    1. 第二个问题是让Doctrine在数据库表的discrimin列中插入正确的值:Person根据@DiscriminatorMap详细信息集。当值为Parent实例(即Person)但不是子实例(即Employee)时,这很有效。谢谢你的帮助。

0 个答案:

没有答案