必须处理一个名为Collection
的实体,它有一个要保存为不同实体的数组。
这是我在控制器中使用的,用于测试我的实体:
// setup items in a controller
$i1 = new Item();
$i1->setInfo('test2');
$i2 = new Item();
$i2->setInfo('example');
// create the collection
$pc = new Collection();
$pc->setId(1);
// set some vars / members
$pc->setInfo('test123');
$pc->setOwner(1);
$pc->setGroup(1);
$pc->setConfig(1);
// add the items
$pc->add($pi1);
$pc->add($pi2);
// store everything
$em = $this->getEntityManager();
$em->persist($pc);
$em->flush();
这是我的Item
实体:
<?php
/**
* Item
* @package application\Entity
*
* @ORM\Entity
* @ORM\Table(name="items")
*/
class Item
{
/**
* @var int
*
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
* @ORM\Column(name="info", type="text")
*/
protected $info;
/**
* @var
* @ORM\ManyToOne(targetEntity="Collection", inversedBy="items")
* @ORM\JoinColumn(name="cid", referencedColumnName="id")
*/
protected $collection;
protected $collection;
/**
* @return string
*/
public function getInfo()
{
return $this->info;
}
/**
* @param string $info
*/
public function setInfo($info)
{
$this->info = $info;
}
}
这是集合实体中的代码
/**
* Collection
* @package Application\Entity
*
* @ORM\Entity
* @ORM\Table(name="collections")
*/
class Collection
{
/**
* @var int
*
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="usr", type="integer")
*/
protected $owner;
/**
* @var string
*
* @ORM\Column(name="grp", type="integer")
*/
protected $group;
/**
* @var string
*
* @ORM\Column(name="cnf", type="integer")
*/
protected $config;
/**
* @var string
*
* @ORM\Column(name="info", type="text")
*/
protected $info;
/**
* @var
* @ORM\OneToMany(targetEntity="Item", mappedBy="items", cascade="all")
*/
protected $items;
public function __construct(){
$this->items = new ArrayCollection();
}
public function add(Item $oItem){
$this->items->add($oItem);
}
我希望它能够在列'cid'中创建id
Collection
的项目。但此列始终为null
:
另一个问题是,它总是保存一个新的Collection
。我希望设置id
会覆盖原始文件。
答案 0 :(得分:2)
我强烈建议您多次阅读,以便在玩双向关联之前充分了解owning-side and inverse-side之间的差异。
Item
实体在这种情况下是拥有方(从学说的角度来看)(1)。你坚持反面(2)。 Doctrine只会检查协会的拥有方是否有变化(3)。还有一些二传手和一些您的实体中缺少需要构建正确双向关系的getter(4)。
将此方法添加到Item
实体:
public function setCollection(Collection $col = null)
{
$this->collection = $col;
return $this;
}
public function getCollection()
{
return $this->collection;
}
更改add
实体中的Collection
方法,如下所示:
public function add(Item $oItem)
{
$this->items->add($oItem);
$oItem->setCollection($this); // Notice this line
}
如果要从Item
;
Collection
public function removeItem(Item $oItem)
{
$this->items->removeElement($oItem);
$oItem->setCollection(null); // This is important too
}
在使用cascade="all"
策略之前,您可能还想了解文档的transitive persistence部分。
希望它有所帮助。