1

请问需要帮忙吗?

我有 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 为每个数据库映射一个实体管理器,如果我调用

$this->entityManager->flush();

在 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 根据 @DiscriminatorMap 详细信息集在数据库表的 discr 列中插入正确的值:Person。当值是父实例(即Person)而不是子实例(即Employee)时,这很有效。感谢您的帮助。
4

0 回答 0