Подтвердить что ты не робот

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")

Любые идеи? Кажется, я ничего не могу найти об этом.

Спасибо

4b9b3361

Ответ 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

Надеюсь, что это поможет.