我有实体Basket
和BasketItem
:如何坚持一个对象有许多相关对象
/**
* Acme\BasketBundle\Entity\Basket
*
* @ORM\Entity(repositoryClass="Acme\BasketBundle\Repository\BasketRepository")
* @ORM\Table(name="orders")
* @ORM\HasLifecycleCallbacks()
*/
class Basket
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
// ...
/**
* @ORM\OneToMany(targetEntity="BasketItem", mappedBy="order_id",cascade={"all"})
*/
protected $items;
// ...
public function __construct() {
$this->items = new ArrayCollection();
}
/**
* Add item
*
* @param BasketItem $item
*/
public function addItem(BasketItem $item)
{
$key = $this->find($item->getProduct()->getId());
if ($key === false) {
$this->items->add($item);
} else {
$this->items->get($key)->raiseQuantity($item->getQuantity());
}
}
/**
* Find an item (if present)
*
* @param integer $id
* @return integer
*/
public function find($id)
{
foreach ($this->items as $key => $item) {
if ($item->getProduct()->getId() == $id)
return $key;
}
return false;
}
}
/**
* Acme\BasketBundle\Entity\BasketItem
*
* @ORM\Entity
* @ORM\Table(name="order_items")
*/
class BasketItem
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
// ...
/**
* @ORM\ManyToOne(targetEntity="Basket", inversedBy="items")
* @ORM\JoinColumn(name="order_id", referencedColumnName="id")
*/
private $basket;
// ...
}
现在,当我创建一个篮子里,用的物品填充它,我有麻烦持续到数据库。
以下不按预期方式工作。
$basket = new Basket();
$basket->addItem(new BasketItem($product1, 1));
$basket->addItem(new BasketItem($product2, 2));
$em->persist($basket);
$em->flush();
然后我试图更紧密地跟随manual:
$basket = new Basket();
$basket->addItem(new BasketItem($product1, 1));
$basket->addItem(new BasketItem($product2, 2));
$em->persist($basket);
foreach ($basket->getItems() as $item) {
$em->persist($item);
}
$em->flush();
如预期既没有没有工作。
在这两种情况下,所有的数据被保存到数据库但篮下项目不涉及到篮下,即BasketItem
实体order_id
是NULL
。
任何人都可以解释我做错了吗?请注意,我是新来的教条。谢谢!
编辑:
我真的糊涂了。这里是我的简单测试:
<?php
namespace Amsel\BasketBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Amsel\BasketBundle\Entity\Basket
*
* @ORM\Entity(repositoryClass="Amsel\BasketBundle\Repository\BasketRepository")
* @ORM\Table(name="orders")
*/
class Basket
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var ArrayCollection $items
*
* @ORM\OneToMany(targetEntity="BasketItem", mappedBy="basket", cascade={"all"})
*/
protected $items;
public function __construct() {
$this->items = new ArrayCollection();
}
/**
* Add item
*
* @param BasketItem $item
*/
public function addItem(BasketItem $item)
{
$this->items->add($item);
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Get items
*
* @return Doctrine\Common\Collections\Collection
*/
public function getItems()
{
return $this->items;
}
}
<?php
namespace Amsel\BasketBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Amsel\BasketBundle\Entity\BasketItem
*
* @ORM\Entity(repositoryClass="Amsel\BasketBundle\Repository\BasketItemRepository")
* @ORM\Table(name="order_items")
*/
class BasketItem
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var Basket $basket
*
* @ORM\ManyToOne(targetEntity="Basket", inversedBy="items")
* @ORM\JoinColumn(name="order_id", referencedColumnName="id")
*/
protected $basket;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set basket
*
* @param Amsel\BasketBundle\Entity\Basket $basket
*/
public function setBasket(\Amsel\BasketBundle\Entity\Basket $basket)
{
$this->basket = $basket;
}
/**
* Get basket
*
* @return Amsel\BasketBundle\Entity\Basket
*/
public function getBasket()
{
return $this->basket;
}
}
public function testAction(Request $request) {
$em = $this->getDoctrine()->getEntityManager();
$basket = new Basket();
$basket->addItem(new BasketItem());
$basket->addItem(new BasketItem());
$em->persist($basket);
try {
$em->flush();
} catch(Exception $e) {
die('ERROR: '.$e->getMessage());
}
die ('end');
}
但还是 - 订单项目(BasketItem
)获取存储但不链接的顺序(Basket
)。
灿你发布你的addItem函数的内容?它在内部调用$ this-> items-> add($ item); ?其余的看起来没问题.. – 2012-01-10 07:18:54
@ Kees Schepers,谢谢你的回复!我已经添加了方法'addItem'(和'find')。如果其余的都没问题,我真的迷失了 - 还有什么想法可以尝试? – Czechnology 2012-01-10 11:41:22
前段时间我有一些类似的问题,你是否可以在你的BasketItem类中指定你的字段$ order_id?因为这可能会导致这些问题。如果你怀疑你可以发布你的整个basketitem实体类。我的朋友已经与我博客了这一点:http://pietervogelaar.nl/doctrine-2-use-foreign-key-as-field-in-dql/ – 2012-01-10 11:49:24