Возможно ли ссылаться на столбец, отличный от 'id' для JoinColumn?

У меня есть объект 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, я получаю эту ошибку:

Notice: Undefined index: id2 in vendor/doctrine/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php line 511

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

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

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

источник: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/limitations-and-known-issues.html#join-columns-with-non-primary-keys

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

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

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