4

「親」によってマップされ、「子」によって反転されたエンティティ(ユーザー)に自己参照の1対多の関連付けがあります。親ではないユーザーを削除できるようにしたい。私の実体は次のように宣言されています。

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();
   }
}

親ではない子ユーザーを削除しようとすると、次のエラーが発生します。

例外'PDOException'とメッセージ'SQLSTATE[23000]:整合性制約違反: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値を取得します。これは DB レベルで発生するため、doctrine:schema:update する必要があります。

于 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 に答える