這是關於當我試圖將一條記錄插入一個關聯實體時與教義的問題。以下是對問題的簡單描述。學說:設置外交關係
我有兩個表,我們稱它們爲One
和Two
。表One
具有表Two
的外鍵,稱爲twoId
,列two_id
。字段two_id
恰好是主鍵的一部分。
* @ORM\Id
* @ORM\Column(name="user_id", type="string", length=40)
*/
private $twoId;
/**
* @ManyToOne(targetEntity="[...]", inversedBy="[...]", fetch="EAGER")
* @JoinColumn(name="two_id", referencedColumnName="id", onDelete="CASCADE")
*/
private $two;
我試圖插入新記錄到表A.這工作:
$two = [.. read from DB ..];
$one = new One();
$one->setTwo($two);
$one->setTwoId($two->getId());
$em->persist($one);
$em->flush();
我不喜歡叫這兩個setTwo
和setTwoId
。此外,我不喜歡在引用它之前閱讀$two
記錄。
如果我跳過setTwoId
調用,出現錯誤:類型爲[..]的實體缺少爲字段'twoId'分配的ID。此實體的標識符生成策略要求在調用EntityManager#persist()之前填充ID字段。
如果我跳過setTwo
電話,我得到的錯誤:完整性約束衝突:1048列「two_id」不能爲空
我的問題是:
我怎樣才能避免調用都
setTwo()
和setTwoId()
?如果我要引用來自
Two
一個實體沒有閱讀它?我應該使用$em->getReference()
嗎?自動正如@lordrhodos指出,宣告場
$twoId
是錯誤的,因爲學說將創建它,而無需一個:(PhpStorm甚至不承認它)
我們需要看到的代碼模型。我想知道爲什麼你在'One'實體上有一個'setTwoId()'函數。關於你的第二個問題:在entityManager上使用引用需要知道id。它將通過代理類獲取對象,並在您嘗試訪問該類的其他屬性時儘快將其保存,因此可以使用它來引用它。 – lordrhodos
你是對的@主持人,有'setTwoId'功能是一個壞主意。感謝幫助。 – user3429660