Отображение Doctrine 2, ссылающееся на уникальный ключ

Основной вопрос:

Можно ли сопоставить ассоциацию, используя ссылку Doctrine, не являющуюся основным, а только уникальным ключом?

Расширенная версия:

У меня есть сущность ( Participation ), которая может ссылаться на 2 других объекта ( DropoutCause и DischargeType ). В зависимости от этой комбинации подразумеваются некоторые другие атрибуты, основанные на другой (четвертой) таблице ( DropoutScenario ) в базе данных. Поскольку любой из двух ссылочных объектов может быть нулевым, я не мог объявить их первичными, но только уникальным ключом в 4-й таблице.

Проблема в том, что я получаю сообщение об ошибке, когда пытаюсь сопоставить это с Doctrine:

Недопустимое значение для идентификатора первичного ключа в приложении \ Entity \ Traininging \ DropoutScenario

Я что-то делаю неправильно, или это просто невозможно с Доктриной? Если нет, есть ли лучшее решение, как я могу это сделать?

Я искал довольно долгое время и вырыл документацию Doctrine, но я просто ничего не мог найти по этому поводу …

Ниже приведены образцы кода моего сопоставления.

Участие:

 <?php namespace Application\Entity\Trainings; use Doctrine\ORM\Mapping as ORM; /** * @ORM\MappedSuperclass */ abstract class Participation { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\ManyToOne(targetEntity="Application\Entity\DropoutCause") * @ORM\JoinColumn(name="dropout_cause_id", referencedColumnName="id")) */ protected $dropoutCause; /** * @ORM\ManyToOne(targetEntity="Application\Entity\DischargeType") * @ORM\JoinColumn(name="discharge_id", referencedColumnName="id")) */ protected $dischargeType; /** * @ORM\ManyToOne(targetEntity="DropoutScenario") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="discharge_id", referencedColumnName="discharge_id"), * @ORM\JoinColumn(name="dropout_cause_id", referencedColumnName="dropout_cause_id") * }) */ private $scenario; 

DropoutScenario:

 <?php namespace Application\Entity\Trainings; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="training_dropout_scenarios") */ class DropoutScenario { /** * @var int * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\ManyToOne(targetEntity="Application\Entity\DropoutCause") * @ORM\JoinColumn(name="dropout_cause_id", referencedColumnName="id")) */ protected $dropoutCause; /** * @ORM\ManyToOne(targetEntity="Application\Entity\DischargeType") * @ORM\JoinColumn(name="discharge_id", referencedColumnName="id")) */ protected $dischargeType; /** @ORM\Column(type="integer", name="dropout_cause_id") */ protected $dropoutCauseId; /** @ORM\Column(type="integer", name="discharge_id") */ protected $dischargeTypeId; 

Поскольку я еще не получил никакого ответа, я провел еще одно исследование сегодня, и я нашел ответ на свой вопрос через форум рассылок Doctrine. Похоже, я просто искал неправильные ключевые слова …

Доктрина 2, к сожалению, не поддерживает его. Как жаль! 🙁

Из документации Doctrine: http://doctrine-orm.readthedocs.org/en/latest/reference/limitations-and-known-issues.html#join-columns-with-non-primary-keys

Невозможно использовать столбцы соединений, указывающие на непервичные ключи. Doctrine подумает, что это первичные ключи и создают ленивые загрузки прокси с данными, что может привести к неожиданным результатам. Doctrine может по соображениям производительности не проверять правильность этих настроек во время выполнения, а только с помощью команды Validate Schema.

Аналогичный вопрос: возможно ли ссылаться на столбец, отличный от 'id' для JoinColumn?

Как и в следующих ссылках, Doctrine не поддерживает этот тип отображения

http://www.doctrine-project.org/jira/browse/DDC-1269

http://www.doctrine-project.org/jira/browse/DDC-1114

Я думаю, это поможет вам.