在Doctrine2上使用manyToOne和oneToMany关系时,“非null违规:7”

时间:2012-10-18 19:22:20

标签: php doctrine-orm

我有一个非常基本的架构:

Comments.yml:

manyToOne:
  pages:
    targetEntity: Pages
    inversedBy: comments
    joinColumn:
      name: page_id
      referencedColumnName: idx

... other things ...

Pages.yml:

oneToMany:
  comments:
    targetEntity: Comments
    mappedBy: pages
    cascade: ["persist"] // i added this later but has no effect for both persist and merge.
    orderBy:
      idx: desc

... other things ...

现在,一切正常。我可以从Pages反向获得Comments。问题是,当我尝试将行插入数据库时​​,它表示page_idnull

示例:

$comment = new Comments();
$comment->setPageId(2); // it is "2"
$comment->setText($textData);

$this->_em->persist($comment);
$this->_em->flush($comment);

现在结果是假的。它会引发异常,并说SQLSTATE[23502]: Not null violation: 7 ERROR: null value in column "page_id" violates not-null constraint

嗯,如果我删除oneToMany和ManyToOne关系,它就可以了!如果我使用它们就会说它即使我给它也是空的...

我的错误在哪里?任何帮助或想法都表示赞赏!

修改

我找到了这种方法:getReference()

$item = $em->getReference('MyProject\Model\Item', $itemId);
$cart->setPage($item);

现在正在工作,但我不知道这是否正确。请注意我。

基本上,我想添加评论,不用修改(不删除或更新)页面表。但是,我想将它们作为ManyToOne和OneToMany一起获取。

1 个答案:

答案 0 :(得分:3)

当您想要向Comments实体添加页面时您应该调用$comment->setPage($page)之类的方法如果使用php app/console doctrine:generate:entities命令行,则会自动生成此方法。 $ page对象应该是从数据库加载的$ page对象。 e.g。

$page = $this->getDoctrine()->getRepository('Pages')->findOneBy(array('id' => $pageId));

$comment = new Comments();
$comment->setPage($page);
$comment->setText($textData);

$this->_em->persist($comment);
$this->_em->flush();

如果这对您没有帮助,请从您的控制器以及页面和评论实体发布您的代码。