Отношение Symfony2 OneToOne становится либо уникальным индексом, либо внешним ключом? - PullRequest
2 голосов
/ 09 октября 2011

Я делаю свои первые шаги в отношениях сущностей Symfony2.У меня есть установка объекта, у каждого из которых есть один метр и один монитор.

Это означает однонаправленное отношение, которое я определил следующим образом:

    /**
     *
     * @ORM\OneToOne(targetEntity="InfoMeter")
     * @ORM\JoinColumn(name="meterid", referencedColumnName="id")
     */
    private $meter;  

    /**
     *
     * @ORM\OneToOne(targetEntity="InstallationsRtu")
     * @ORM\JoinColumn(name="monitorid", referencedColumnName="id")
     */
    private $monitor;

Каждый монитор может толькобыть назначенным на одну установку.Каждый счетчик может быть назначен нескольким установкам.

Когда я обновляю свою базу данных (доктрина приложения / консоли: схема: обновление --force), есть два результата.
В случае монитора:
Все идет хорошо, схема обновляется с использованием ключевого имени с префиксом «UNIQ _».

В случае счетчика: я получаю следующую ошибку

PDOException]                                                                                             
  SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'UNIQ_43D26968860BE41D'

Когда я смотрю наСтруктура таблицы после возникновения этой ошибки, я не могу найти упомянутое ограничение, но я нахожу FK_43D26968860BE41D, то есть то же самое, но с префиксом 'FK'.

В таблице установки у меня теперь есть эти перечисленные:

Keyname                 Type    Unique  Packed  Field     Cardinality
PRIMARY                 BTREE   Yes No  id    2 
UNIQ_43D26968701EC1AB   BTREE   Yes No  monitorid 2     
FK_43D26968860BE41D BTREE   No  No  meterid   2

Итак, один говорит «Уникальный = Да», а другой - «Уникальный = Нет».

Чтобы прийти к моему вопросу:
Как я могу решить, является ли ониндекс UNIQ или индекс FK?Я предполагаю, что Doctrine увидела, что в настоящее время каждый monitorid уникален в таблице установки, но что каждый метр встречается несколько раз в таблице установки.
Следовательно, он пошел с UNIQ для первого и FK для последнего.Но могу ли я как-то это контролировать?

1 Ответ

4 голосов
/ 09 октября 2011

Если один измеритель может быть назначен нескольким установкам, не следует ли вам определить отношение OneToMany?

В вашей сущности установки:

/**
 * @ORM\ManyToOne(targetEntity="InfoMeter", inversedBy="installations")
 * @ORM\JoinColumn(name="infometer_id", referencedColumnName="id")
 */
protected $info_meter;

А затем в вашей сущности InfoMeter:

/**
 * @ORM\OneToMany(targetEntity="Installation",mappedBy="info_meter")
 */
protected $installations;

Кроме того, вы должны добавить в конструктор класса InfoMeter следующее:

function __construct() {
   [...]
   $this->installations = new \Doctrine\Common\Collections\ArrayCollection();
}

Я уверен, что этот подход может быть улучшен в зависимости от того, как вы хотите установить связь между "установками"и "метров", но это должно работать.

...