Doctrine2 preRemove OneToMany

rkm*_*max 2 doctrine-orm

在我的模型中,我有

Terrain.php

/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks()
*/
class Terrain
{

 /**
  * @var lots
  *
  * @ORM\OneToMany(targetEntity="Lot", mappedBy="terrain")
  */
  private $lotes;

  /**
   * @ORM\PreRemove
   */
  public function deleteAllLots()
  {
    $lots = $this->getLots();

    foreach ($lots as $lot) {
        $this->lots->removeElement($lot);
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

Lot.php

/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks()
*/
class Lot
{

 /**
  * @var Terrain
  *
  * @ORM\ManyToOne(targetEntity="Terrain", inversedBy="lots")
  * @ORM\JoinColumns({
  *   @ORM\JoinColumn(name="terrain_id", referencedColumnName="id")
  * })
  */
  var $terrain

}
Run Code Online (Sandbox Code Playgroud)

批量

我正在尝试删除地形,但之前我删除了与之相关的所有批次.当我尝试删除地形时,我收到一个错误SQLSTATE[23000]: Integrity constraint violation

小智 9

你仍然有一个参考的lotsterrain上删除,这就是为什么你有一个Integrity constrait violation.

试试这个 :

/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks()
*/
class Terrain
{
    /**
    * @var lots
    *
    * @ORM\OneToMany(targetEntity="Lot", mappedBy="terrain")
    */
    private $lotes;

    /**
    * @ORM\PreRemove
    */
    public function deleteAllLots()
    {
        $lots = $this->getLots();

        foreach ($lots as $lot) {
            $this->lots->removeElement($lot);
            $lot->terrain = null; //$lot->setTerrain(null); will be better, try to add getters and setters
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果lots要从数据库中删除,则应使用关系cascade属性OneToMany(doctrine-project.com上的一对多引用),如下所示:

/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks()
*/
class Terrain
{
    /**
    * @var lots
    *
    * @ORM\OneToMany(targetEntity="Lot", mappedBy="terrain", cascade={"remove"})
    */
    private $lotes;
}
Run Code Online (Sandbox Code Playgroud)

Terrain删除,所有批次都将被删除.