Doctrine中相关实体的奇怪问题

时间:2014-06-25 19:34:53

标签: php symfony doctrine-orm annotations

我在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行

现在,我已经从各个角度看待这个问题,但仍然看不出这个代码有什么问题。你能帮忙吗?

2 个答案:

答案 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。