symfony2中的刷新错误

时间:2013-01-18 16:52:55

标签: symfony doctrine-orm many-to-many symfony-2.1

很长一段时间以来,我尝试使用属性处理多对多的关系。

我重新检查了实体,表格......一切都很好看。仍然会收到错误:

这种关系是这样构建的:Book> OneToMany>作者书< ManyToOne<作者

嵌套表单允许创建书籍,使用年份属性创建作者。

到目前为止,我只是想记录新作者,以便在处理与书的关系之前使它们存在。

这是我的代码:

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关系有关?我的代码只试图录制一个新作者......

由于

EDIT _____________

确实,我进行了进一步的测试,并且使用此代码进行了严格的测试:

public function onSuccess(Page $page){   
    $this->em->flush();

这也会产生相同的错误,就好像错误不是由表单处理代码引起的...... 我使用this method验证了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类型的实体通过外国实体具有身份   作者,但是这个实体本身没有任何优势。你必须打电话   EntityManager#persist()在相关实体上并确保它是一个   在尝试持久化'AuthorBook'之前生成了标识符。在   后插入ID生成的情况(例如MySQL自动增量或   PostgreSQL SERIAL)这意味着你必须调用EntityManager #flush()   在两个持续的操作之间。

我知道我需要在AuthorBook之前坚持并刷新书籍和作者。但是,我无法冲洗任何东西。当我不坚持任何事情时,我甚至会犯这个错误。

2 个答案:

答案 0 :(得分:1)

您的班级AuthorBook出现问题。删除@ORM\Id$author的{​​{1}}并添加正确的ID字段。更新架构时应该有一条错误消息,但如果没有:

$book

php app/console doctrine:schema:update --force; 更新为:

AuthorBook

答案 1 :(得分:0)

如果你在AuthorBook中没有任何专栏(只有外键),我可以尝试建立多种关系。

网址:Many-to-Many Doctrine documentation