Doctrine OneToOne неправильно?генерирование УНИКАЛЬНОГО ИНДЕКСА - PullRequest
32 голосов
/ 21 ноября 2011

SchemaTool создает уникальный индекс для ассоциаций OneToOne. Я считаю, что это неправильно.

В разделе 6.6 страницы справочника по ассоциациям в Doctrine показан пример OneToOne для продукта, который имеет одну отправку. Это показано для создания таблицы продукта:

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

Есть идеи? Кажется, я ничего не могу найти по этому поводу.

Спасибо

Ответы [ 2 ]

47 голосов
/ 21 ноября 2011

Если в одной организации много пользователей, а во многих пользователях одна и только одна организация, это не однозначная ассоциация.

Индивидуальные ассоциации должны быть уникальными.

Ваша ассоциация 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();
}
1 голос
/ 25 октября 2014

Возможно, версия YML может помочь кому-то еще, начиная с доктрины / symfony. Вот моя версия этого:

User.orm.yml

manyToOne:
    organisation:
        targetEntity: Organisation
        joinColumn:
            name: organisation_id
            referencedColumnName: id

Organisation.orm.yml

oneToMany:
    users:
        targetEntity: User
        mappedBy: organisation
        joinColumn:
            name: organisation_id
            referencedColumn: id

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

...