Реализация наследования таблиц классов (CTI) для нескольких таблиц базы данных в Doctrine 2 - PullRequest
1 голос
/ 06 апреля 2011

Вам нужна помощь, пожалуйста?

У меня есть 2 класса, родительский класс, скажем, человек и ребенок говорят, что сотрудник использует стратегию отображения наследования таблиц классов 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 

ОбратноеЗначение true, если я вызываю менеджер сущностей (для dbTwo), чтобы сохранить объект Employee.Проблема отсутствует, когда таблицы находятся в одной базе данных.Как я могу обойти эту проблему, пожалуйста?Кроме того, как я могу получить SQL-запрос, который менеджер сущностей использует во время операции flush ()?Было бы полезно узнать, какой SQL генерируется и используется - например:

$this->entityManager->getQuery(); // очевидно, это просто для объяснения того, что я имею в виду

  1. Вторая проблема - получение Doctrine.чтобы вставить правильное значение в столбец discr таблицы базы данных: Person в соответствии с набором подробностей @DiscriminatorMap.Это хорошо работает, когда значением является Parent instance (т.е. Person), но не дочерний экземпляр (т.е. Employee).Спасибо за помощь.
...