教義:1対多のカスケードの例外:整合性制約違反1451

pdresselhaus:

私は非常に基本的なCMSを使用して構築しようとしていますSymfonyDoctrine私はそうのように私のサイトの構造をエミュレートするエンティティを持っています:

エンティティ:ページ

/**
 * @ORM\Entity(repositoryClass="App\Repository\ContentTree\PageRepository")
 */
class Page extends SortableBase
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     * @ORM\OrderBy({"sort_order" = "ASC"})
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Website", inversedBy="pages", cascade={"all"}, fetch="EAGER")
     */
    private $website;

    /**
     * Owning side of relation
     * @ORM\OneToMany(targetEntity="Section", mappedBy="page", fetch="EAGER")
     */
    private $sections;


    public function __construct()
    {
    ...

エンティティ:セクション

/**
 * @ORM\Entity(repositoryClass="App\Repository\ContentTree\SectionRepository")
 */
class Section extends SortableBase
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Page", inversedBy="sections", cascade={"all"}, fetch="EAGER")
     */
    private $page;

    /**
     * Owning side of relation
     * @ORM\OneToMany(targetEntity="Entry", mappedBy="section", fetch="EAGER")
     */
    private $entries;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\SectionTemplating\SectionType", fetch="EAGER")
     */
    private $sectionType;


    public function __construct()
    {

エンティティ:エントリ

/**
 * @ORM\Entity(repositoryClass="App\Repository\ContentTree\EntryRepository")
 */
class Entry extends SortableBase
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Section", inversedBy="entries", cascade={"all"}, fetch="EAGER")
     */
    private $section;

    /**
     * Owning side of relation
     * @ORM\OneToMany(targetEntity="App\Entity\ContentTypes\Content", mappedBy="entry", fetch="EAGER")
     */
    private $contents;


    public function __construct()
    {
    ...

だから、端部AにPage持つことができますSectionsすることができたEntriesなどと。今、私はから収集するものからドキュメント私はどのように私のセットアップと仮定していたcascades私はちょうど行くと使用できるEntityManager任意のエンティティのインスタンスを削除するには(発言権をすることができますSection)、それは自動的にそのインスタンスを削除するだけでなく、すべて含まれているでしょうEntries

しかし、ときに私は次のように実行します。

$section = $this->getSectionByID($sectionid);

$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($section);
$entityManager->flush();

や否やSectionいずれかを持ってEntries、私が取得します:

An exception occurred while executing 'DELETE FROM section WHERE id = ?' with params [10]:

SQLSTATE[23000]: Integrity constraint violation: 
1451 Cannot delete or update a parent row: 
a foreign key constraint fails (`webdata`.`entry`, CONSTRAINT `FK_2B219D70D823E37A` 
FOREIGN KEY (`section_id`) REFERENCES `section` (`id`))

私はそれが何を意味するか知っているが、私はちょうど私が強制するために、ここでは異なる何をすべきかを把握することはできませんEntityManager私のエンティティグラフと下から上へ、削除、すべてをダウントラバースします。

pdresselhaus:

ためにはことが判明したDoctrineカスケード接続するにはremove、単にそのように所有している側に注釈を付けるだろうエンティティ関係グラフ1ダウン:

/**
 * Owning side of relation
 * @ORM\OneToMany(targetEntity="Page", mappedBy="website", cascade={"all"}, fetch="EAGER")
 */
private $pages;

これは、しかし、本当にちょうどあなたが例えば中に起こるしたいものORMを伝えますremoveこれは、データベースへの実際の呼び出し中に何が起こるかをモデル化するために十分ではありません。このために、一つは、追加を追加する必要があります@ORM\JoinColumn(onDelete="CASCADE")ので、同じように、逆サイドへ:

/**
 * @ORM\ManyToOne(targetEntity="Website", inversedBy="pages", fetch="EAGER")
 * @ORM\JoinColumn(onDelete="CASCADE")
 */
private $website;

意図したとおりに、このすべての作品では。私はまた、手動経由エントリ削除して最終的にはできる午前phpMyAdminも前に私にエラーを与えたが。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=294272&siteId=1