使用多對一和一對多的關係時,我有這樣的一個非常基本的模式:「非空侵犯: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_id
是null
。
實施例:
$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一起獲取。
我的代碼和你的答案完全一樣。我在那個時候。而不是'findOneBy()'我使用'getReference()'。因爲如果我使用'findOneBy()'方法,它從數據庫中獲取,然後重新插入它。這是**嚴重** ......如果在處理評論時在後臺進行更改,該怎麼辦?所以,我不得不插入評論,而無需修改或抓取頁表... _Also **從我的問題的例子**是從我的'Controller' ..._基本上,我不想添加頁面。我只想爲page_id = 2的評論表添加一條評論......但是教條強制我傳遞整個頁面實體。 – xangr
xangr:您的代碼與展示的代碼不同。學說與對象圖一起工作。你正在思考關鍵字與底層表相關的方式。學說應該爲你管理。注意,@Krypthonite獲得一個$頁面的「實體」,並調用setPage()傳遞它。當您通常沒有可用的對象時,getReference是傳遞實際對象的替代方法。是否最好使用引用或$ obj = findOneBy()取決於你在代碼中使用$ page做什麼。它會做的查詢在這裏可能是等價的。 – gview
@xangr Doctrine只會在您調用某個setter時修改您的Pages實體。在我發佈的代碼頁面實體根本沒有修改。 – jovobe