2012-07-28 141 views
0

我一直在做直接的MySQL很長一段時間,現在正在嘗試以ORM的方式做事情。我有一個用戶創建設計的網站。設計表有一個映射到User.id的字段「userId」。設計實體有一個值,$用戶,定義實體之間的關係:用doctrine2中的映射更新實體

/** 
* @ORM\ManyToOne(targetEntity="User") 
* @ORM\JoinColumn(name="userId", referencedColumnName="id") 
*/ 
private $user; 

這是不錯的,我現在可以加載一個設計實體,並以$設計 - >用戶>姓氏獲取用戶的姓氏。

現在讓我們說一個用戶創建一個新的設計。我喜歡保存實體:

$design = new Design(); 
$design->setTitle($_POST['title']); 
$design->setUserId($_POST['userId']); 
$em = $this->getDoctrine()->getEntityManager(); 
$em->persist($design); 
$em->flush(); 

當我做到這一點,它沒有這樣的消息,用戶id,這使得沒有空,爲空。我想我可能會錯誤地傳遞給它,但是當我刪除它工作正常設計實體$用戶,所以我認爲這是預期中的用戶對象傳遞,以及像:

$design->user = new User($userId) 

我不我真的想添加一個數據庫調用來獲取整個用戶,當我已經知道所需的ID時。處理這個最簡單的方法是什麼?

+0

在持久化Design實體的控制器操作中 - 您是否已經獲取用戶e。 G。進行訪問/權限檢查等?另外,如果你做$ design-> user = new User($ userId);你可能會從你的數據庫中獲得另一個持久保存的用戶或重複的輸入錯誤。 – Max 2012-07-28 20:36:54

+0

這是一個很好的問題。設計通過API提交(它們不是圖像,但規格),因此我使用安全令牌來確定用戶標識。 API只是獲取令牌及其設計規範,而令牌不包含整個用戶對象。這是關於新設計,因爲你是對的,當他們編輯現有的設計時,控制器會提供包括$ user在內的整個對象。 – SkippyFlipjack 2012-07-28 21:59:22

回答

0

希望我已經瞭解你的db設計,你是一個用戶表和設計表。每個用戶可能有很多設計。對?然後在你的設計實體中有一個現場用戶及其設置者(public setUser())和一個獲取者方法(public getUser())。在設計實體的持久性期間,它總是期望ORM中的User字段(不是id)的用戶對象。在ORM中,用戶和設計之間的foreginkey關係通過對象進行映射。

所以在你的情況下,堅持設計實體 1.從userId製作用戶對象。

$em = $this->getDoctrine()->getEntityManager();//make your entity manager 
    $userobj=$em->getRepository('yourBundle:User')->find($userId); 
    $design = new Design(); 
    $design->setTitle($_POST['title']); 
    $design->setUser($userobj); 
    $em->persist($design); 
    $em->flush(); 

一Imoprtant件事確保在您的設計單位不具有該領域用戶id,而不是用戶。如果您需要刪除userid的getter和setter方法並編輯您的yml文件或添加註釋(如果您使用註釋)