Sonata Admin OneToMany关系中的左孤儿记录

时间:2014-06-09 09:51:48

标签: php symfony doctrine-orm one-to-many sonata-admin

我与拖车桌(Municipality和Poi)有关的OneToMany(一个市有很多Pois)。因此,Poi表中有一个字段表示相关的市政当局。

我希望允许Poi元素保持孤儿状态(没有指定市政当局)。

Doctrine中的实体声明如下:

/**
 * Municipality
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Poc\PocBundle\Entity\MunicipalityRepository")
 */
class Municipality
{
    /**
     * @ORM\OneToMany(targetEntity="Poi", mappedBy="municipality", cascade={"persist"})
     */
    protected $pois;

    public function __construct()
    {
        $this->pois = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;


public function setPois($pois)
{
    if (count($pois) > 0) {
        foreach ($pois as $i) {
            $this->addPoi($i);
        }
    }

    return $this;
}
public function addPoi(\Poc\PocBundle\Entity\Poi $poi)
{
    $poi->setMunicipality($this);
    $this->pois->add($poi);
}

public function removePoi(\Poc\PocBundle\Entity\Poi $poi)
{
    $this->pois->removeElement($poi);
}

...(以及由doctrine生成的各个getter / setter:generate:entities)

/**
 * Poi
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Poc\PocBundle\Entity\PoiRepository")
 */
class Poi
{
    /**
     * @ORM\ManyToOne(targetEntity="Municipality", inversedBy="pois")
     * @ORM\JoinColumn(name="municipality_id", referencedColumnName="id")
     */
    protected $municipality;

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

...(以及由doctrine生成的各个getter / setter:generate:entities)

在管理员方面,MunicipalityAdmin :: configureFormFields定义如下:

protected function configureFormFields(FormMapper $formMapper)
{
    $formMapper
        ->add('name')
        ->add('pois', null, array('by_reference' => false), array(
            'edit' => 'inline',
            'inline' => 'table',
            'sortable'  => 'position'
        ))
;
}

这允许我添加与市政当局相关的Pois,并将它们记录在数据库中。但是当我想要删除一个关系(也不是Poi,只有关系并离开Poi孤儿)时没有任何反应。

如果我将Municipality实体配置如下,我可以强制删除它:

@ORM\OneToMany(targetEntity="Poi", mappedBy="municipality", cascade={"persist"}, orphanRemoval=true))

......但是以这种方式,显然,我不仅要删除市政与Poi之间的关系,还要删除Poi本身。我希望行为是取消设置关系,将此记录的Poi.municipality_id字段保留为空。

我正在追踪行动并看到这一行..

    $this->pois->removeElement($poi);
当我从列表中删除项目时执行

...但$this->pois的值在此行之前和之后是相同的。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:0)

我错过了将poi.municipality_id设置为null ...

的行
public function removePoi(\Poc\PocBundle\Entity\Poi $poi)
{
    $this->pois->removeElement($poi);
    $poi->setMunicipality(null);
}

完成了!