很长一段时间以来,我尝试使用属性处理多对多的关系。
我重新检查了实体,表格......一切都很好看。仍然会收到错误:
这种关系是这样构建的: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之前坚持并刷新书籍和作者。但是,我无法冲洗任何东西。当我不坚持任何事情时,我甚至会犯这个错误。
答案 0 :(得分:1)
您的班级AuthorBook
出现问题。删除@ORM\Id
和$author
的{{1}}并添加正确的ID字段。更新架构时应该有一条错误消息,但如果没有:
$book
将php app/console doctrine:schema:update --force;
更新为:
AuthorBook
答案 1 :(得分:0)
如果你在AuthorBook中没有任何专栏(只有外键),我可以尝试建立多种关系。