Ми}{@лbI4

Блог хеллоуворлдщика

Внешний + первичный ключ в Doctrine ORM

09.03.2020 doctrine, orm, php

Иногда встает необходимость использовать первичный ключ таблицы как связь к другой таблице. От некоторых людей я слышал, что в 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