我与拖车桌(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
的值在此行之前和之后是相同的。
有没有办法实现这个目标?
答案 0 :(得分:0)
我错过了将poi.municipality_id设置为null ...
的行public function removePoi(\Poc\PocBundle\Entity\Poi $poi)
{
$this->pois->removeElement($poi);
$poi->setMunicipality(null);
}
完成了!