Можно ли ссылаться на столбец, отличный от 'id' для JoinColumn? - PullRequest
17 голосов
/ 19 января 2012

У меня есть объект Item, который имеет отношение ManyToOne к объекту Category. Я хочу, чтобы к ним присоединилось поле, отличное от категории id (в данном случае это поле называется id2). Моя схема указана ниже.

class Item {
    /**
     * @ORM\Id
     * @ORM\Column(name = "id", type = "integer")
     * @ORM\GeneratedValue(strategy = "AUTO")
     */
    protected $id;
    /**
     * @ORM\ManyToOne(targetEntity = "Category")
     * @ORM\JoinColumn(name = "category_id", referencedColumnName = "id2")
     */
    protected $category;
}

class Category {
    /**
     * @ORM\Id
     * @ORM\Column(name = "id", type = "integer")
     * @ORM\GeneratedValue(strategy = "AUTO")
     */
    protected $id;
    /**
     * @ORM\Column(name = "id2", type = "string", length = "255", unique = "true")
     */
    protected $id2;

Когда я пытаюсь сохранить Item, я получаю эту ошибку:

Примечание: неопределенный индекс: id2 в строке vendor / doctrine / lib / Doctrine / ORM / Persisters / BasicEntityPersister.php 511

Конечно, если я поменяю id2 на id в аннотации JoinColumn, все работает нормально, но мне нужно, чтобы сущности были связаны через id2. Это возможно?

Редактировать
То, чего я хочу достичь, невозможно в соответствии с официальной Доктриной 2 документа.

Невозможно использовать столбцы соединения, указывающие на неосновные ключи. Доктрина будет думать, что это первичные ключи и создает ленивую загрузку прокси с данными, которые могут привести к неожиданным результатам. доктрина может из соображений производительности не подтвердить правильность этого настройки во время выполнения, но только с помощью команды Validate Schema.

source: http://www.doctrine -project.org / docs / orm / 2.1 / en / reference / sizes-and-known-questions.html

Ответы [ 2 ]

8 голосов
/ 22 января 2012

Я думаю, что Doctrine хочет, чтобы они были первичными ключами, от документов :

name: имя столбца, который содержит идентификатор внешнего ключа для этого отношения.

Еще одна вещь, которая бросается в глаза из вашего примера кода, это category.id2 , являющийся type string , я бы по крайней мере ожидал, что это будет целое число , но может также потребоваться, чтобы @ JoinColumn работал правильно.

Вы можете обойтись просто с помощью @ Index на category.id2 и оставить его в виде строки ; в любом случае стоит попробовать.

4 голосов
/ 19 марта 2015

Просто чтобы сообщить. Я смог присоединиться к не-ПК в отношении Many2One (однонаправленного), НО мой объект не может быть загружен обычным способом Он должен быть загружен с DQL как:

SELECT d,u FROM DEntity d
    JOIN d.userAccount u

таким образом я перестал получать сообщение об ошибке: Отсутствует значение для идентификатора первичного ключа на ....

...