У меня есть объект 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
. Это возможно?
редактировать
То, чего я хочу достичь, невозможно в соответствии с официальными документами Doctrine 2.
Невозможно использовать столбцы соединений, указывающие на непервичные ключи. Doctrine подумает, что это первичные ключи и создают ленивые загрузки прокси с данными, что может привести к неожиданным результатам. Doctrine может по соображениям производительности не проверять правильность этих настроек во время выполнения, а только с помощью команды Validate Schema.
источник: http://www.doctrine-project.org/docs/orm/2.1/en/reference/limitations-and-known-issues.html
Я думаю, что Доктрина хочет, чтобы они были первичными ключами, из документов :
name: Имя столбца, которое содержит идентификатор внешнего ключа для этого отношения.
Другая вещь, которая выпрыгивает из меня из вашего примера кода, – это category.id2, являющаяся строкой типа , я бы по крайней мере ожидал, что это будет целое число , но также может быть необходимо, чтобы @JoinColumn работал правильно.
Вы можете уйти с помощью @Index на category.id2 и оставить его как строку ; все равно.
Просто сообщить. Я смог присоединиться к не-ПК в отношении Many2One (однонаправленное), но мой объект не может быть загружен обычным способом. Он должен быть загружен с помощью DQL:
SELECT d,u FROM DEntity d JOIN d.userAccount u
таким образом я прекратил получать ошибку: Отсутствует значение для идентификатора первичного ключа ….