Возможно ли ссылаться на столбец, отличный от '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
таким образом я прекратил получать ошибку: Отсутствует значение для идентификатора первичного ключа....