Join-Table包含元数据,组合键和一对多关系

时间:2014-04-28 19:12:57

标签: symfony doctrine-orm

我正在构建一个可以带有指定版本的商品的购物车。

我正在使用Symfony 2.4.3Doctrine 2

我有三个实体的代码,CartCartItemCartItemVersion

Cart.php

// ----

/**
 * @ORM\OneToMany(targetEntity="CartItem", mappedBy="cart")
 */
private $cartItems;

// ----

CartItem.php

// ----

/**
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="Cart")
 */
private $cart;

/**
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="Item")
 */
private $item;

/**
 * @ORM\OneToMany(targetEntity="CartItemVersion", mappedBy="cartItem")
 */
private $cartItemVersions;

// ----

CartItemVersion.php

// ----

/**
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="CartItem")
 */
private $cartItem;

/**
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="ItemVersion")
 */
private $itemVersion;

// ----

在更新架构时,我收到了此错误。

[Doctrine\ORM\ORMException]
Column name `id` referenced for relation from CartItemVersion towards CartItem does not exist.

然后我为cartItem_id和其他人中的CartItemVersion.php等字段命名。

然后更新架构返回

[Doctrine\DBAL\DBALException]                                                
An exception occurred while executing 'ALTER TABLE cart_item_version ADD CONSTRAINT FK_4D3EA2E02EA80FC1 FOREIGN KEY (cartItem_id) REFERENCES cart_item (cartItemVersion_id)':

SQLSTATE[HY000]: General error: 1005 Can't create table 'symfony.#sql-3d8_12a' (errno: 150)

我已经引用了Doctrine 2的文档,并使用了OrderItem的用例,但似乎这是因为复合主键,但仍然提供正确的名称无法解决此问题。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

在您的映射中,您遇到了一系列问题,这些问题已在下面进行了更正。您需要定义引用的列名和它自己的列名;此外,对于那些已映射的字段,您还需要定义inversedBy。

Cart.php

/**
* @var ArrayCollection
* @ORM\OneToMany(targetEntity="CartItem", mappedBy="cart")
*/
private $cartItems;

CartItem.php

/**
* @ORM\ManyToOne(targetEntity="Cart", inversedBy="cartItems")
* @ORM\JoinColumn(name="cart_id", referencedColumnName="id")
*/
private $cart;

/**
* @ORM\ManyToOne(targetEntity="Item")
* @ORM\JoinColumn(name="item_id", referencedColumnName="id")
*/
private $item;

/**
* @var ArrayCollection
* @ORM\OneToMany(targetEntity="CartItemVersion", mappedBy="cartItem")
*/
private $cartItemVersions;

CartItemVersion.php

/**
* @ORM\ManyToOne(targetEntity="CartItem", inversedBy="cartItemVersions")
* @ORM\JoinColumn(name="cart_item_id", referencedColumnName="id")
*/
private $cartItem;

/**
* @ORM\ManyToOne(targetEntity="ItemVersion")
* @ORM\JoinColumn(name="item_version_id", referencedColumnName="id")
*/
private $itemVersion;

要获取更多信息,请检查Relationship Mapping Metadata Documentation

答案 1 :(得分:0)

我认为你必须一步一步地让你的实体慢慢来。 从单向开始,然后在必要时添加双向... 使用association mapping documentation

这个答案可能是评论,但由于我的声誉而无法发表评论......