Иногда встает необходимость использовать первичный ключ таблицы как связь к другой таблице. От некоторых людей я слышал, что в Doctrine ORM
такое сделать невозможно и приходиться иметь обязательно инкрементный первичный ключ. На самом деле, это необязательно и возможность совмещать первичный ключ с внешним у Doctrine ORM
имеется из коробки с версии 2.1. Для этого нам нужен атрибут association-key
(для XML; или associationKey
для YAML).
К сожалению, это не совсем очевидная возможность и люди испытывают трудности с поиском информации по данному вопросу. Поэтому, я решил опубликовать короткую заметку об этом.
Итак, чтобы наш первичный ключ стал и внешним ключом нужно в карте сущности указать первичный ключ и связь с одинаковым именем:
Как можно увидеть, я определил первичный ключ task
, где указал, что это ассоциативный ключ (association-key="true"
), который ссылается на связь task
, где указал, что она (связь) ссылается на поле task_id
в таблице БД. Вот и всё. Так просто. =) И заметьте, что у первичного ключа нет никакого генератора (strategy="NONE"
).
Данный прием работает только со связями Many-To-One
и One-To-One
.
Оф. документация: https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/tutorials/composite-primary-keys.html#identity-through-foreign-entities