Реализация наследования таблиц классов (CTI) для нескольких таблиц базы данных в Doctrine 2
Нужна помощь, пожалуйста?
У меня есть 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
На самом деле есть две проблемы.
- Поскольку Doctrine отображает одного менеджера сущностей на базу данных, если я позвоню
$ This->entityManager-> заподлицо ();
На объекте Person это помечает ошибку:
Message: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'dbOne.Employee' doesn't exist
Обратное верно, если я вызываю менеджер сущностей (для dbTwo), чтобы сохранить объект Employee. Проблема отсутствует, когда таблицы находятся в одной базе данных. Как я могу обойти эту проблему, пожалуйста? Кроме того, как я могу получить SQL-запрос, который менеджер сущностей использует во время операции flush()? Было бы полезно узнать, какой SQL генерируется и используется, например:
$this->entityManager->getQuery();
// очевидно, это просто, чтобы объяснить, что я имею в виду
- Вторая проблема - заставить Doctrine вставить правильное значение в столбец discr таблицы базы данных: Person в соответствии с набором подробностей @DiscriminatorMap. Это хорошо работает, когда значением является Parent instance (т.е. Person), но не дочерний экземпляр (т.е. Employee). Спасибо за помощь.