У меня есть объект 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 
таким образом я прекратил получать ошибку: Отсутствует значение для идентификатора первичного ключа ….