Doctrine - OneToOne关系 - EntityNotFoundException

时间:2014-11-15 19:44:18

标签: php doctrine-orm zend-framework2

我想指定两个实体Item和ItemPrice之间的关系。项目可以有价格,但不必,所以它应该像在sql中左连接。我使用了OneToOne关系,JoinColumn和nullable = true,我得到 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 个答案:

答案 0 :(得分:0)

我认为您的映射是错误的。

您在与nullable=true的{​​{1}}关联中为item_id加入列撰写OneToOne。意味着如果ItemPriceitem_id,则没有关联的ItemPrice。但是null是主要的ID列,因此总是会有一个值,因此ORM将始终尝试为item_id找到ItemPrice,从而导致 EntityNotFoundException 您应该Item拥有关系的拥有方,或者您应该在ItemPrice中设置price_id并将其用作连接列。

您应该考虑使用Doctrine来创建/插入表格并验证您的实体定义,然后您就不会遇到这些问题。