Основной вопрос:
Можно ли сопоставить ассоциацию, используя ссылку 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
Я думаю, это поможет вам.