5

當你要插入一個Entity你這樣做:你如何使用Doctrine 2中的實體關係?

$user = new User(); 
$user->setEmail('[email protected]'); 

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

但是,如果我想創建可以具有一個用戶的文章是什麼;

目前,我需要做的:

$user = $em->getRepository('User')->find($id); 
$article->setUser($user); 

這是因爲關係的,原則2請求的用戶實體。

但是,我不能「模擬」的用戶對象,因爲我不希望的ID可以手動設置,所以我不能做信息:

$user = new User(); 
$user->setId(45); 

我錯了這個行爲,你好嗎?

加載用戶實體只是爲了設置關係,即使是使用高速緩存(這不總是一個選項),尤其是對於更新,可能是性能問題。

回答

10

如果你沒有一個管理用戶實體得心應手,你要的是一個reference proxy,其中EM會很樂意給你:

<?php 
$article = new Entity\Article(); 
$article->setTitle('Reference Proxies Rule'); 
$article->setBody('...'); 
$article->setUser($em->getReference('Entity\User',45)); 
$em->persist($article); 
$em->flush(); 
+0

真棒,謝謝(再次!) – JohnT 2011-05-16 09:04:27

+0

洛爾蒂姆,再次這個難以捉摸的'getReference()'功能保存一天。順便說一句 - 在代碼'$ em()'中輸入錯字。 – Cobby 2011-05-16 13:36:35

+0

@Cobby - 它看起來像#1清晰記錄,但經常被忽視的功能。畢竟,我們可能已經找到了一個體面的使用案例。感謝typofix。 – timdev 2011-05-16 17:27:33

-1

爲什麼您的文章需要用戶在第一個地方有一個ID?你應該能夠在沒有EntityManager的情況下對你的實體進行單元測試,如果你不能,那麼你可能可能做錯了什麼。然後當你做功能單元測試時,它就是simple as this

我建議你看看Zend Casts的Unit Testing Doctrine 2 Entities

+1

嗯,這不是問題,無論是現有用戶或不是,如果我想用現有的用戶更新我的文章,我需要先取得用戶實體,否則如果我的用戶沒有ID,Doctrine2如何知道用戶?我的文章絕對不需要讓用戶有效。我只是說我不能讓一個實體設置自己的ID,因此模擬一個用戶對象。 – JohnT 2011-05-15 23:01:03

+0

順便說一句,謝謝你的鏈接,但我已經知道這個截屏,但我沒有發現真正有用的實體單元測試。 – JohnT 2011-05-15 23:05:14