ここで実際のコードを投稿することはできません。代わりに代用を使用すると、基本的には同じです。構文上の誤りがあるかどうかは分かりません。DoctrineはIntegrityの制約違反を起こします。1451
私は以下のセットアップを持っています: PHP 7.0、Symphony、DoctrineはMySQLデータベースで動作します。
クラスは以下のとおりです。
/*
* @ORM\Table(name="Postoffice")
* @ORM\Entity(repositoryClass="\AppBundle\Repsoitory\PostOfficeRepository")
*/
class Postoffice
{
/**
* Holds the Doctrine entity manager for database interaction
* @var EntityManager $em
*/
protected $em;
/**
* @var int
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(stragegy="AUTO")
*/
private $id;
/** @var ArrayCollection
* @ORM\ManyToMany(targetEntity="MailBox")
* @ORM\JoinTable(name="PostOfficeToMailBoxMapping",
* joinColumns={@ORM\JoinColumn(name="PostOfficeId",referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="MailBoxId",referencedColumnName="id",unique=true)})
*/
private $packets;
public function __construct(EntityManager $em)
{
$this->$packets = new ArrayCollection();
$this->em = $em;
}
}
/*
* @ORM\Table(name="PostStorage")
* @ORM\Entity(repositoryClass="\AppBundle\Repsoitory\PoststorageRepository")
*/
class Poststorage
{
/**
* Holds the Doctrine entity manager for database interaction
* @var EntityManager $em
*/
protected $em;
/**
* @var int
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(stragegy="AUTO")
*/
private $id;
/** @var ArrayCollection
* @ORM\ManyToMany(targetEntity="MailBox")
* @ORM\JoinTable(name="PostStorageToMailBoxesMapping",
* joinColumns={@ORM\JoinColumn(name="PoststorageId",referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="MailBoxId",referencedColumnName="id",unique=true)})
*/
private $MailBoxes;
public function __construct(EntityManager $em)
{
$this->MailBoxes = new ArrayCollection();
$this->em = $em;
}
public function delete()
{
//remove each box on its own
foreach ($this->Mailboxes as $iterMailBox)
$this->em->remove($iterMailBox);
$this->em->remove($this);
$this->em->flush();
}
}
/*
* @ORM\Table(name="MailBox")
* @ORM\Entity(repositoryClass="\AppBundle\Repsoitory\MailBoxRepository")
*/
class MailBox
{
/**
* @var int
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(stragegy="AUTO")
*/
private $id;
/** @var ArrayCollection
* @ORM\ManyToMany(targetEntity="Letter")
* @ORM\JoinTable(name="MailBoxToLetterMapping",
* joinColumns={@ORM\JoinColumn(name="MailBoxId",referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="LetterId",referencedColumnName="id",unique=true)})
*/
private $mailsInBox;
__construct()
{
$mailsInBox = new ArrayCollection();
}
}
class Letter
{
/**
* Holds the Doctrine entity manager for database interaction
* @var EntityManager $em
*/
protected $em;
/**
* @var int
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(stragegy="AUTO")
*/
private $id;
//lets assume this is a string
private $letterContent;
}
今何イムは、ここでモデル化しようとするには、次のものがある:
メールボックスが手紙の束のコンテナsomethinglikeです。
1つのメールボックスは、一度に1つの場所で、1つだけで、その生涯の特定の時点に存在することができます。しかし、これらの2つの場所の間でコンテナを移動することができます。ポストオフィスとポストストレージ。
これらのマッピングをSQLデータベースに作成するのは問題ではありません。
手紙N ------ 1つのメールボックス(単方向とは、テーブルに参加)
メールボックスN ------ 1つのポストオフィスまたはPostStorage(との一方向の表を結合する)
問題が付属しています次の機能コンテナと文字の間で個々のコンテナや文字を削除/マージ/分割できるようにしたい。
イムは、単に使用して文字またはメールボックスを削除しようとした場合:
$em->remove($InstanceOfLetterOrMailBox);
$em->flush();
イムは、「整合性制約違反」に述べたタイトルに、なって。
メールボックスが別の場所にある可能性があるので、私は本当にクラスの所有者にレフェリーを追加することを避けたいと思います。クラスコードのサイズを大きく膨らませます。メールボックスが将来に存在する場所。
アイブ異なるクラスに
Ondelete = CASCADEのさまざまな組み合わせを試し、最後の数時間を過ごすことが、私はやって管理するすべてのデシベルか単一削除することから、すべてのクラスを削除し、イムいない場合のいずれかでした上記のエラーメッセージが返されます。
さらに詳しい情報が必要な場合はお知らせください。
ありがとうございます。