私は私にとって非常に複雑なフォームを処理しようとしています...
書籍(OneToMany)、記事(OneToMany)、およびその著者(ManyToMany)を含むコレクションがあります。
ユーザーは本を編集できます。記事を追加または削除したり、記事ごとに著者を追加または削除したりできます。ネストされたフォームがあります:book>article>author。作成者がコレクションに初めて参加する場合は、そのコレクション用に作成されます。
エンティティの説明は見栄えがよく、データベースはコンソールによって生成され、一貫しているように見えます。
ブックエディションフォームを使用して著者に対応する必要がない場合、これは正常に機能しています。著者が存在する場合、重複エントリのバグがあります。作成者が新しい場合、「新しいエンティティを明示的に永続化するか、関係に対してカスケード永続化操作を構成する」というバグがあります。
コードは次のとおりです。
public function onSuccess(Book $book)
{
$this->em->persist($book);
foreach($book->getArticles() as $article)
{
$article->setUrlname($this->mu->generateUrlname($article->getName()));
$article->setBook($book);
// Saving (and creating) the authors of the book
foreach ($this->collectionWithAuthors->getAuthors() as $existAuthor){
foreach($article->getAuthors() as $author) {
$authorUrlname=$this->mu->generateUrlname($author->getFirstname().' '.$author->getLastname());
if ( $existAuthor->getUrlname() == $authorUrlname) { // The author is existing
$article->addAuthor($existAuthor);
$this->em->persist($existAuthor);
}else{ // New Author
$newAuthor = new Author();
$newAuthor->setCollection($this->collectionWithBaseArticles);
$newAuthor->setLastname($author->getLastname());
$newAuthor->setFirstname($author->getFirstname());
$newAuthor->setUrlname($authorUrlname);
$this->em->persist($newAuthor);
$article->addAuthor($newAuthor);
}
}
}
$this->em->persist($article);
}
$this->em->flush();
}
カスケードの使い方がわかりません。ただし、$ article-> addAuthor()は$ authors-> addArticle()を呼び出すことになっています。
記事エンティティの抽出
/**
* @ORM\ManyToMany(targetEntity="bnd\myBundle\Entity\Author", mappedBy="articles")
*/
private $authors;
/**
* Add authors
*
* @param bnd\myBundle\Entity\Author $authors
* @return Article
*/
public function addAuthor(\bnd\myBundle\Entity\Author $authors)
{
$this->authors[] = $authors;
$authors->addArticle($this);
}