2017-06-14 87 views
0

這是關於當我試圖將一條記錄插入一個關聯實體時與教義的問題。以下是對問題的簡單描述。學說:設置外交關係

我有兩個表,我們稱它們爲OneTwo。表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(); 

我不喜歡叫這兩個setTwosetTwoId。此外,我不喜歡在引用它之前閱讀$two記錄。

如果我跳過setTwoId調用,出現錯誤:類型爲[..]的實體缺少爲字段'twoId'分配的ID。此實體的標識符生成策略要求在調用EntityManager#persist()之前填充ID字段。

如果我跳過setTwo電話,我得到的錯誤:完整性約束衝突:1048列「two_id」不能爲空

我的問題是:

  1. 我怎樣才能避免調用都setTwo()setTwoId()

  2. 如果我要引用來自Two一個實體沒有閱讀它?我應該使用$em->getReference()嗎?自動

    正如@lordrhodos指出,宣告場$twoId是錯誤的,因爲學說將創建它,而無需一個:(PhpStorm甚至不承認它)

+0

我們需要看到的代碼模型。我想知道爲什麼你在'One'實體上有一個'setTwoId()'函數。關於你的第二個問題:在entityManager上使用引用需要知道id。它將通過代理類獲取對象,並在您嘗試訪問該類的其他屬性時儘快將其保存,因此可以使用它來引用它。 – lordrhodos

+0

你是對的@主持人,有'setTwoId'功能是一個壞主意。感謝幫助。 – user3429660

回答

0

如果有人做了同樣的錯誤定義。

定義:

/** 
* @ManyToOne(targetEntity="[...]", inversedBy="[...]", fetch="EAGER") 
* @JoinColumn(name="two_id", referencedColumnName="id", onDelete="CASCADE") 
*/ 
private $two; 

用法:

$two = [.. read from DB ..]; 
$one = new One(); 

$one->setTwo($two); 

$em->persist($one); 
$em->flush();