Реализация наследования таблиц классов (CTI) в нескольких таблицах базы данных в Doctrine 2

#mysql #inheritance #doctrine-orm #mysql-error-1146

#mysql #наследование #doctrine-orm #mysql-ошибка-1146

Вопрос:

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

У меня есть 2 класса, родительский класс, скажем, Person и дочерний класс, скажем, Employee, использующий стратегию сопоставления наследования таблиц классов Doctrine 2. Соответствующие таблицы классов существуют в отдельных таблицах базы данных: таблица Person существует в database: 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 
  

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

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

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

Комментарии:

1. Похоже, что технологии ORM ограничены в своей способности генерировать SQL-запросы, которые запрашивают несколько баз данных в одной инструкции SQL (единице работы). Это в значительной степени может быть связано с тем, что entity manager ограничен одной базой данных. Это ограничение может быть причиной такого поведения.