我在Symfony中使用Doctrine2,我有以下设置:
一个Item类:
/**
* Class Item
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="OneShortly\CommonBundle\Entity\ItemRepository")
*/
class Item
{
/**
* @ORM\ManyToOne(targetEntity="Category")
* @ORM\JoinColumn(name="primaryCategory", referencedColumnName="foreignId")
*/
private $primaryCategory;
}
分类:
/**
* Category
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="OneShortly\CommonBundle\Entity\CategoryRepository")
*/
class Category
{
/**
* @var integer
*
* @ORM\Column(name="foreignId", type="integer", unique=true)
*/
private $foreignId;
}
现在我这样做了:
$item = new Item();
$item->setPrimaryCategory($category);
$this->em->persist($item);
$this->em->flush();
我收到此错误:
[Symfony \ Component \ Debug \ Exception \ ContextErrorException]注意: 未定义的索引:foreignId in 家用/ WWW /项目/供应商/教义/ ORM / lib中/教义/ ORM /持久化/ BasicEntityPersister.php 第692行
现在,我已经从各个角度看待这个问题,但仍然看不出这个代码有什么问题。你能帮忙吗?
答案 0 :(得分:2)
经过一些挖掘后,我通过使用 doctrine:schema:validate 找出了自己:
[Mapping] FAIL - 实体类 'Acme \ CommonBundle \ Entity \ Item'映射无效: *引用的列名“foreignId”必须是目标实体类的主键列 '的Acme \ CommonBundle \实体\类别'。
[数据库]失败 - 数据库架构与当前模式不同步 映射文件。
因此,我将外键从foreignId更改为id(恰好是主键)并且它可以正常工作。当然,我可以使用foreignId作为主键,但实际上我意识到我不需要它。
答案 1 :(得分:0)
看看http://symfony.com/doc/current/book/doctrine.html#relationship-mapping-metadata。
你应该宁愿:
/**
* Class Item
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="OneShortly\CommonBundle\Entity\ItemRepository")
*/
class Item
{
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="items")
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
*/
private $primaryCategory;
}
和
/**
* Category
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="OneShortly\CommonBundle\Entity\CategoryRepository")
*/
class Category
{
/**
* @ORM\OneToMany(targetEntity="Item", mappedBy="primaryCategory")
*/
private $items;
}
忘记ORM中的ID。