ZF2 / Doctrine不会让我保存一个集合

时间:2015-08-25 13:04:51

标签: php doctrine-orm zend-framework2

必须处理一个名为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会覆盖原始文件。

1 个答案:

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

希望它有所帮助。