#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
На самом деле есть две проблемы.
- Поскольку 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();
// очевидно, это просто для объяснения того, что я имею в виду
- Вторая проблема заключается в том, чтобы заставить Doctrine вставить правильное значение в столбец discr таблицы базы данных: Person в соответствии с набором сведений @DiscriminatorMap. Это хорошо работает, когда значением является родительский экземпляр (т. Е. Person), но не дочерний экземпляр (т.Е. Employee). Спасибо за помощь.
Комментарии:
1. Похоже, что технологии ORM ограничены в своей способности генерировать SQL-запросы, которые запрашивают несколько баз данных в одной инструкции SQL (единице работы). Это в значительной степени может быть связано с тем, что entity manager ограничен одной базой данных. Это ограничение может быть причиной такого поведения.