自从我尝试处理具有属性的多对多关系以来已经有很长一段时间了。
我重新检查了实体,表格......一切看起来都很好。仍然得到一个错误:
关系是这样建立的: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 具有身份,但是该实体本身没有实体。您必须在相关实体上调用 EntityManager#persist() 并确保在尝试保留“AuthorBook”之前生成了一个标识符。在 Post Insert ID Generation(例如 MySQL Auto-Increment 或 PostgreSQL SERIAL)的情况下,这意味着您必须在两个持久化操作之间调用 EntityManager#flush()。
我知道我需要在 AuthorBook 之前坚持和刷新书籍和作者。但是,我无法冲洗任何东西。当我不坚持任何事情时,我什至有这个错误。