2012-10-18 26 views
3

使用多對一和一對多的關係時,我有這樣的一個非常基本的模式:「非空侵犯:7」 上Doctrine2

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 ... 

現在,一切都工作得很好。我可以從Comments反向得到Pages。問題是,當我嘗試插入一行到數據庫中,它說: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一起獲取。

回答

3

當你想添加一個頁面的評論實體,你應該調用像$comment->setPage($page)自動生成該方法的方法,如果你使用php app/console doctrine:generate:entities命令行。 $頁面對象應該是從數據庫加載的$頁面對象。例如

$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(); 

如果這沒有幫助您,請將您的代碼從您的控制器以及頁面和評論實體上發佈。

+0

我的代碼和你的答案完全一樣。我在那個時候。而不是'findOneBy()'我使用'getReference()'。因爲如果我使用'findOneBy()'方法,它從數據庫中獲取,然後重新插入它。這是**嚴重** ......如果在處理評論時在後臺進行更改,該怎麼辦?所以,我不得不插入評論,而無需修改或抓取頁表... _Also **從我的問題的例子**是從我的'Controller' ..._基本上,我不想添加頁面。我只想爲page_id = 2的評論表添加一條評論......但是教條強制我傳遞整個頁面實體。 – xangr

+2

xangr:您的代碼與展示的代碼不同。學說與對象圖一起工作。你正在思考關鍵字與底層表相關的方式。學說應該爲你管理。注意,@Krypthonite獲得一個$頁面的「實體」,並調用setPage()傳遞它。當您通常沒有可用的對象時,getReference是傳遞實際對象的替代方法。是否最好使用引用或$ obj = findOneBy()取決於你在代碼中使用$ page做什麼。它會做的查詢在這裏可能是等價的。 – gview

+1

@xangr Doctrine只會在您調用某個setter時修改您的Pages實體。在我發佈的代碼頁面實體根本沒有修改。 – jovobe