我正在尝试处理一个对我来说非常复杂的表格......
我们有收藏,其中包含书籍 (OneToMany)、文章 (OneToMany) 及其作者 (ManyToMany)。
用户可以编辑一本书:他可以添加或删除一篇文章,并为每篇文章添加或删除一些作者。有嵌套形式:书籍>文章>作者。如果作者是集合中的新作者,则会为该集合创建它。
实体描述看起来不错,数据库由控制台生成并且看起来一致。
如果我不必与使用书籍版本表格的作者打交道,这很好用。如果作者存在,我有一个重复的条目错误。如果作者是新人,我有一个“显式持久化新实体或在关系上配置级联持久化操作”的错误。
这是代码:
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);
}