1

自从我尝试处理具有属性的多对多关系以来已经有很长一段时间了。

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

关系是这样建立的: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 之前坚持和刷新书籍和作者。但是,我无法冲洗任何东西。当我不坚持任何事情时,我什至有这个错误。

4

2 回答 2

1

你的课出了点问题AuthorBook。删除@ORM\Id两者$author$book添加正确的 id 字段。您应该在更新架构时收到错误消息,但如果您没有:

php app/console doctrine:schema:update --force;

对此进行更新AuthorBook

class AuthorBook
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     *
     * @var integer $id
     */
    protected $id;


    /**
     * @ORM\ManyToOne(targetEntity="cmd\MyBundle\Entity\Author", inversedBy="authorBooks", cascade={"persist"})
     * @ORM\JoinColumn(nullable=false)
     */
    private $author;

    /**
     * 
     * @ORM\ManyToOne(targetEntity="cmd\MyBundle\Entity\Book", inversedBy="authorBooks", cascade={"persist"})
     * @ORM\JoinColumn(nullable=false)
     */
    private $book;
于 2013-01-25T09:14:33.527 回答
0

如果您在 AuthorBook 中没有更多列(只有外键),我可以尝试建立多对多关系。

网址:多对多 Doctrine 文档

于 2013-01-22T14:39:11.823 回答