У меня две таблицы, db1.Contact и db2.Recipient. Каждый получатель должен быть контактом, поэтому у меня есть внешний ключ, установленный между двумя таблицами в поле db1.Contact.ContactID.
Я представляю это в Recipient.php со следующей аннотацией:
/** * @ORM\Id * @ORM\ManyToOne(targetEntity="\db1\Contact") * @ORM\JoinColumn(name="ContactID", referencedColumnName="ContactID") **/ private $Contact;
Для этого мне не нужен код в Contact.php.
Когда я создаю базу данных (используя доктрину orm: schema-tool: create –dump-sql), я вижу, что поле Recipient.ContactID создано и задано индексом. Однако для создания ограничения внешнего ключа не создается и не выполняется запрос. Поэтому, чтобы быть ясным, я не получаю никаких ошибок, но ограничение никогда не генерируется.
Как я могу это решить? Разумеется, доктрина поддерживает межсайтовые внешние ключи? Я проверил документацию по аннотации и посмотрел, есть ли какие-либо опции для инструмента создания, но я не вижу возможности включить эту функцию.
Я нашел обходное решение для этого, которое я объясню здесь . По сути, Doctrine по умолчанию использует внешние ключи кросс-баз данных, потому что не все системы баз данных поддерживают его, но вы можете отключить его, комментируя некоторый код в библиотеке Doctrine.
Ваша ассоциация ManyToOne
кажется неправильной. Вы должны использовать FQCN сущностей, если ваша кодовая база находится в пространстве имен (или просто имя класса, если сущности обеих сторон находятся в одном каталоге), а не имена таблиц .
Например
/** * @ORM\Id * @ORM\ManyToOne(targetEntity="YourNamespace\Entities\Contact") * @ORM\JoinColumn(name="ContactID", referencedColumnName="ContactID") **/ private $contact;
Вы можете больше узнать об ассоциации.
Doctrine не поддерживает Cross-DB FK:
В Доктрине объединение данных по базам данных технически не поддерживается конструктивной функцией, но вы можете заставить ее работать, обмакнув Doctrine немного.
Источник: http://www.doctrine-project.org/2009/06/19/cross-database-joins.html