4

我在由“父”映射并由“子”反转的实体(用户)上有一个自引用的一对多关联。我希望能够删除不是父母的用户。我的实体声明如下。

class User implements UserInterface
{
   /**
    * @ORM\Column(name="id", type="smallint")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
   protected $id;

   (...)

   /**
    * @ORM\OneToMany(targetEntity="User", mappedBy="parent")
    */
   protected $children;

   /**
    * @ORM\ManyToOne(targetEntity="User", inversedBy="children")
    * @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
    */
   protected $parent;

   public function __construct()
   {
       $this->parentId = null; // Default value for column parent_id
       $this->children = new ArrayCollection();
   }
}

当我尝试删除不是父母的子用户时,我收到以下错误。

带有消息“SQLSTATE [23000]”的异常“PDOException”:违反完整性约束:1451 无法删除或更新父行:外键约束失败

我尝试过进行级联删除,如下所示。

/**
 * @ORM\OneToMany(targetEntity="User", mappedBy="parent", cascade={"persist", "remove"})
 */
protected $children;

无论哪种方式都会出现相同的错误。有什么帮助吗?

4

3 回答 3

9

用这个:

/**
* @ORM\ManyToOne(
*     targetEntity="User", 
*     inversedBy="children", 
*     cascade={"persist", "remove"}
* )
*
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="SET NULL")
*/

什么onDelete="SET NULL"是当您删除父元素时,其子元素将在 parent_id 列中获得 NULL 值。这发生在数据库级别,所以你必须学说:模式:更新。

于 2012-10-24T13:54:50.787 回答
0

最后,我设法在保留父类别的同时删除了一个子类别:

$parent = $em->getRepository('Category\Entity\Category')->find(1);//parent id
$child = $em->getRepository('Category\Entity\Category')->find(5);// child id
$parent->removeChild($child);
    $em->persist($child);
    $em->remove($child);
    $em->persist($parent);      
    $em->flush(); 
于 2013-11-02T16:20:19.717 回答
-1

cascade必须在拥有方

/**
 * @ORM\ManyToOne(
 *     targetEntity="User", 
 *     inversedBy="children", 
 *     cascade={"persist", "remove"}
 * )
 */
protected $parent;
于 2012-10-24T10:50:58.430 回答