属性との多対多の関係を処理しようとしてから、かなり長い時間がかかりました。
エンティティ、フォームを再確認しました...すべて問題ないようです。それでもエラーが発生します:
関係は次のように構築されます: Book > OneToMany > AuthorBook < ManyToOne < Author
ネストされたフォームを使用すると、書籍を作成できます。この書籍から、年属性を使用して作成された著者が作成されます。
これまでのところ、本との関係を処理する前に新しい著者を存在させるために、新しい著者を記録しようとしているだけです。
これが私のコードです:
foreach ($book->getAuthorBooks() as $authorBook) {
$AuthorUrlname = $this->mu->generateUrlname( $authorBook->getAuthor()->getFirstname().'-'.$authorBook->getAuthor()->getLastname() );
// If the author does not exist yet, it is added to the database:
$checkAuthor = $this->em->getRepository('cmdMyBundle:Author')->findOneByUrlname($AuthorUrlname);
if ($checkAuthor == null) {
// Author does not exist
$newAuthor = new Author();
$newAuthor->setLastname($authorBook->getAuthor()->getLastname());
$newAuthor->setFirstname($authorBook->getAuthor()->getFirstname());
$newAuthor->setUrlname($AuthorUrlname);
$newAuthor->setCollection($this->collection);
$this->em->persist($newAuthor);
$this->em->flush();
}else{
// Author already exists
}
}// foreach $authorBook
そしてエラー:エンティティの永続操作をカスケードするように構成されていない関係 'cmd\MyBundle\Entity\Book#authorBooks' を通じて新しいエンティティが見つかりました: cmd\MyBundle\Entity\authorBook@0000000002571fc4000000002c4ddfaa.
エラーが authorBooks 関係に関連しているのはなぜですか? 私のコードは新しい作成者を記録しようとするだけです...
ありがとう
編集_____________
確かに、私はさらにテストを行い、このコードで抜本的なテストを行いました:
public function onSuccess(Page $page){
$this->em->flush();
これも、フォーム処理コードが原因ではないかのように、同じエラーを生成します...このメソッドを使用して orm スキーマを検証しましたが、これまでのところすべて問題ないようです。
エンティティをカスケードして永続化しようとしました:
class AuthorBook
{
/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity="cmd\MyBundle\Entity\Author", inversedBy="authorBooks", cascade={"persist"})
* @ORM\JoinColumn(nullable=false)
*/
private $author;
/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity="cmd\MyBundle\Entity\Book", inversedBy="authorBooks", cascade={"persist"})
* @ORM\JoinColumn(nullable=false)
*/
private $book;
--
class Book
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="cmd\MyBundle\Entity\AuthorBook", mappedBy="book", cascade={"persist"})
*/
private $authorBooks;
--
class Author
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="cmd\MyBundle\Entity\AuthorBook", mappedBy="author", cascade={"persist"})
*/
private $authorBooks;
これにより、エラー メッセージが更新されます。
タイプ AuthorBook のエンティティは、外部エンティティ Author を介して ID を持っていますが、このエンティティ自体にはエンティティがありません。関連するエンティティで EntityManager#persist() を呼び出し、「AuthorBook」を永続化する前に識別子が生成されていることを確認する必要があります。Post Insert ID Generation (MySQL Auto-Increment や PostgreSQL SERIAL など) の場合、これは、両方の永続操作の間に EntityManager#flush() を呼び出す必要があることを意味します。
AuthorBook の前に本と著者を永続化してフラッシュする必要があることを理解しています。しかし、私は何もフラッシュできません。何も永続化しない場合でも、このエラーが発生します。