2013-03-23 61 views
12

我有一個故事表和用戶表。故事表中的列用戶標識是引用用戶表中的標識的外鍵。主義多對一的關係堅持運作

我設定的關係是用戶可能有許多故事存儲在故事表中。我已經創建了這兩個表的實體。

但是,如果嘗試僅對故事表執行操作,它將詢問新用戶條目的詳細信息。

我的目標是用現有的userId添加一個新故事。

我在這裏張貼的錯誤:

一個新的實體是通過關係「故事#_userId」這 沒有配置級聯發現持續經營的實體: 用戶@ 0000000038960c50000000008ea93852。爲了解決這個問題: 顯式調用這個未知實體上的EntityManager#persist()或 配置級聯在映射中堅持這個關聯,例如 @ManyToOne(..,cascade = {\「persist \」})。

我設置多對一關係Story實體:

/** 
* @ManyToOne(targetEntity="User", inversedBy = "_story") 
* @JoinColumns({ 
*  @JoinColumn(name="user_id", referencedColumnName="id") 
* }) 
*/ 

private $_userId; 

我檢查了數據庫架構,它表明的關係是否設置正確。所以我完成了故事插入過程。

$user = new User(); 
$user->setUserId($id); 
$story = new Story(); 
$story->setContent("...."); 
$story->setUserid($user); 
$this->em->persist($story); 
$this->em->flush(); 

回答

0

我很努力去理解你需要什麼,所以我不確定這是否會迴應你的問題。

作爲story.user_id id user.id(它是主鍵)的外鍵,它不能爲空/空。因此,如果假設您有一個php會話,則應該將您的用戶標識(或用戶名)存儲在會話變量中,並且當您在故事表中創建新記錄時,請使用會話中的用戶標識來填充story.user_id屬性。

希望它有幫助。

+0

謝謝你的迴應。但我需要在教條中做這些事情。 – Sujith 2013-03-23 12:24:24

0

如果您附加您的邀請,我會很有幫助。

但我想這對我來說是類似的問題。您不能在一個字段中一起定義@Id和@ManyToOne。您必須爲@Id和@ManyToOne關係使用單獨的字段。

如果您有一個新的(尚未保留的)用戶實體,您必須在字段對應Story實體中持久保存具有cascade = {「persist」}或cascade = {「all」}的用戶。只有在用戶已經存在並且它已連接到Doctrine時,纔可以存儲Story實體。

希望它有幫助。

+0

嗨,我附上的實體。我檢查了由教義和它的設置好的方案。如果我檢索故事實體的詳細信息,我應該得到用戶實體的詳細信息,因爲user_id是外鍵 – Sujith 2013-03-25 04:41:45

23

您可能會堅持故事實體,但不是用戶。如果你有這樣的事情:

$story = new Story(); 
$user = new User(); 
$story->setUser($user); 
$em->persist($story); 
$em->flush(); 

這將導致一個致命的錯誤,因爲你堅持一個實體,而是通過其關係學說找到另一個新的實體。你有兩個選擇:

呼叫堅持兩個實體:

$story = new Story(); 
$user = new User(); 
$story->setUser($user); 
$em->persist($story); 
$em->persist($user); 
$em->flush(); 

或者,建立級聯持續故事實體。例如。如果您使用的標註映射,你會做這樣的事情

/** 
* @ManyToOne(targetEntity="User", mappedBy="stories", cascade={"persist"}) 
*/ 
private $author; 

本章8. Working with associations細節這一點。

+0

嗨,我不想在用戶表中執行持久操作。只需要在故事實體中執行操作。但是如果我檢索故事實體的詳細信息我應該獲取用戶實體的詳細信息,因爲user_id是外鍵 – Sujith 2013-03-25 04:40:26

+4

對我來說同樣的問題。我的用戶實體來自結果緩存查詢,因此是DETACHED。我想創建新的故事,而不合並用戶使其成爲MANAGED。這基本上就是Sujith所要求的。有沒有像「cascade = {ignore}」參數? – andig 2013-08-13 09:04:37

0

你不覺得你應該設置User,而不是Useridstory

$user = new User(); 
$user->setUserId($id); 
$story = new Story(); 
$story->setContent("...."); 
$story->setUser($user); //change here 
$this->em->persist($story); 
$this->em->flush(); 
3

K.諾伯特的回答過癮,但有一些可能是不清楚的。至少我不清楚誰是從SQL中學到的。

事情是教條似乎記得哪些對象已經持續。每當它發現新的(未持續存在)與您想要堅持的實體相關的對象時 - 它會以'通過關係發現新實體...'的錯誤來大吼。當你想保存新的對象(只有一個實體,沒有保留相關的實體),你只需要確保相關的實體已經被保存了。 所以:

$story = new Story(); 
$entityManager->find('User', $id); 
$story->setUser($user); 
$em->persist($story); 
$em->flush(); 

有竅門。因爲教義知道用戶已經堅持,並且不需要再做。學說知道是因爲我們從數據庫中獲得了用戶。