Doctrine OneToOne неправильно? генерируя УНИКАЛЬНЫЙ ИНДЕКС
SchemaTool генерирует уникальный индекс для ассоциаций, которые являются OneToOne. Я считаю, что это неверно.
В разделе 6.6 страницы руководства Ассоциации в Doctrine показан пример OneToOne для продукта с одной доставкой. Это показано для создания таблицы Product:
CREATE TABLE Product (
id INT AUTO_INCREMENT NOT NULL,
shipping_id INT DEFAULT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
Однако, с тем же кодом для моего объекта Пользователь имеет одну Организацию, моя таблица пользователя SQL генерируется как
CREATE TABLE User (
id INT AUTO_INCREMENT NOT NULL,
organisation_id INT DEFAULT NULL,
UNIQ_3B978F9FA7F43455 (organisation_id),
PRIMARY KEY(id)
) ENGINE = InnoDB;
Это не позволяет мне добавить 2 пользователей в одну организацию. Неправильно.
Я добавил, что попытался быть подробным с уникальным параметром аннотации JoinColumn.
@JoinColumn(name="organisation_id", referencedColumnName="id", unique="false")
Любые идеи? Кажется, я ничего не могу найти об этом.
Спасибо
Ответы
Ответ 1
Если у одной организации есть много пользователей, и у многих пользователей есть одна и только одна организация, то это не ассоциация "один-к-одному".
Индивидуальные ассоциации должны быть уникальными.
Ваша ассоциация ManyToOne
на стороне пользователя и OneToMany
на стороне организации.
User.php
/**
* @ManyToOne(targetEntity="Organisation")
*/
private $organisation;
Organisation.php
use Doctrine\Common\Collections\ArrayCollection;
/**
* @OneToMany(targetEntity="User", mappedBy="organisation")
*/
private $users;
function __construct() {
$this->users = new ArrayCollection();
}
Ответ 2
Возможно, версия YML может помочь кому-то другому, начиная с doctrine/symfony, вот моя версия:
в User.orm.yml
manyToOne:
organisation:
targetEntity: Organisation
joinColumn:
name: organisation_id
referencedColumnName: id
в Organisation.orm.yml
onToMany:
users:
targetEntity: User
mappedBy: organisation
joinColumn:
name: organisation_id
referencedColumn: id
Надеюсь, что это поможет.