我正在构建一个可以带有指定版本的商品的购物车。
我正在使用Symfony 2.4.3
和Doctrine 2
我有三个实体的代码,Cart
,CartItem
和CartItemVersion
。
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
的用例,但似乎这是因为复合主键,但仍然提供正确的名称无法解决此问题。
有人可以帮忙吗?
答案 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。
这个答案可能是评论,但由于我的声誉而无法发表评论......