2014-11-15 4 views
0

Я хочу указать связь между двумя объектами Item и ItemPrice. Элемент может иметь цену, но не обязательно, поэтому он должен быть чем-то вроде левого соединения в sql. Я использовал отношение OneToOne, JoinColumn с nullable = true и получаю Исключение EntityNotFoundException. Вот мой код:Доктрина - отношение OneToOne - EntityNotFoundException

class Item 
{ 

/** 
* @ORM\Column(type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="IDENTITY") 
*/ 
protected $item_id; 

/** 
* @ORM\Column(type="string") 
*/ 
protected $name; 

/** 
* @ORM\Column(type="string") 
*/ 
protected $image_file; 

/** 
* @ORM\OneToOne(targetEntity="ItemPrice") 
* @ORM\JoinColumn(name="item_id", referencedColumnName="item_id", nullable=true) 
*/ 
protected $price; 
... 
} 


class ItemPrice 
{ 

/** 
* @ORM\Column(type="integer") 
* @ORM\Id 
*/ 
protected $item_id; 

/** 
* @ORM\Column(type="integer") 
*/ 
protected $gold; 

/** 
* @ORM\Column(type="integer") 
*/ 
protected $silver; 

/** 
* @ORM\Column(type="integer") 
*/ 
protected $bronze; 
... 
} 

Таблицы:

CREATE TABLE `item` (
`item_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`name` varchar(150) NOT NULL, 
`image_file` varchar(100) DEFAULT NULL, 
PRIMARY KEY (`item_id`), 
UNIQUE KEY `uk_item_name` (`name`)); 

CREATE TABLE `item_price` (
`item_id` int(11) NOT NULL, 
`gold` int(11) NOT NULL DEFAULT '0', 
`silver` int(11) NOT NULL DEFAULT '0', 
`bronze` int(11) NOT NULL DEFAULT '0', 
PRIMARY KEY (`item_id`)); 

Я думаю, что я сделал, называется однонаправленным OneToOne: http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html#one-to-one-unidirectional на мой взгляд, это именно то, что мне нужно.

+1

Вы можете указать свои определения пространства имен? – cptnk

+0

Любой успех, решающий вашу проблему с моим ответом? – Wilt

ответ

0

Я думаю, что ваше отображение неверно.

Вы пишете nullable=true за item_id в колонке OneToOne с ItemPrice. значение, если item_id - null нет ассоциировать ItemPrice. Но item_id это столбец первичного идентификатора и, таким образом, всегда будет иметь значение, так ОРМ всегда будет пытаться найти ItemPrice для вашего Item приводит к EntityNotFoundException Вы должны либо сделать ItemPrice-владелец стороны отношений или вы должны сделать a price_id в вашем ItemPrice и использовать его в качестве столбца объединения.

Вам следует рассмотреть возможность использования Doctrine для создания/вставки таблиц и проверки ваших сущностей, тогда у вас не будет таких проблем.

Смежные вопросы