2011-10-25 66 views
0

例如起見構件:doctrine2 - 實體是

我有以下模式:

users(id, name) 
groups(id,name) 
user_groups(user_id, group_id) 

我想獲取屬於某個組的用戶。問題是,我知道組ID,所以我不想加入組表 - user_groups就足夠了。

結果應該是

SELECT * FROM `users` AS u 
LEFT JOIN `user_groups` AS ug ON (ug.`user_id` = u.`id) 
WHERE ug.`group_id` = X 
// i know the value of X 

我在doctrine2企圖導致另一加入groups表。

我得到的最接近的事是:

SELECT u FROM models\User u WHERE ?1 MEMBER OF u.groups 

,但它也將LEFT JOIN它裏面的 「WHERE EXISTS(...)」

可以這樣無需本地查詢完成(使用DQL /查詢生成器)?

回答

0

這裏是DQL查詢:

$query = $em->createQuery('SELECT u.id, u.name FROM Path\To\Users u LEFT JOIN u.groups g WHERE g.id = :group'); 
$query->setParameter('group', $group); 
$users = $query->getResult(); 

我也傾向於認爲有關連接表項這樣的查詢,但學說似乎更有意義,當你在社團方面想想以及您的實體包含的對象的集合。

+0

這完全不正確。這將LEFT JOIN組表,我試圖避免。請閱讀問題 – galchen

+0

抱歉誤會。我會順從一個懂得爲什麼你不想使用你在實體中建立的聯繫的人。祝你好運。 – cantera

+0

我使用的關聯,除了在這種情況下 - 沒有理由左加入組表。可以左加入user_groups只看用戶是否是一個組的成員(因爲我知道該組的ID) – galchen

3

ORM優於ActiveRecord模式的優點之一是,您不需要爲連接表創建新的實體。

所以這裏當你使用Doctrine時,user_groups表將被映射到兩邊。

這意味着你不能直接訪問user_groups表。除非你使用原生的SQL,我強烈建議反對。

因此,解決您的情況的最佳方法是使用findOneBy($group_id)關於羣組回購,並從中獲取用戶。理論上正確的實施方式。

- 編輯 - 的評論:

是的,我同意,由純DB POV它的效率更高。

但是,如果沒有本機查詢,您將無法做到這一點,因爲DQL,查詢構建器以及與教義相關的所有內容都使用實體執行操作,並且由於您在設計中使用了ORM,因此您不會有實體加入表格。

否則唯一的方法是將您的映射從a many to many relation from user to groups using join table更改爲a one-to-many from users to user_groups and a many-to-one from user_groups to groups。這樣你將有一個實體user_groups

然後您可以直接使用該實體來獲取用戶。

即使它是一個黑客,其技術上並非&理論上正確地使用這樣的。除非連接表也有其他責任。

+0

但這會導致2個查詢。我目前的技術,只增加一個左連接將運行在1查詢。我目前的方法更有效率。 – galchen

+0

答案對於評論太大,所以請檢查我的答案以上。 :) –

+0

在這種情況下,您可以「獲取組和用戶的請求」或「獲取屬於組的所有用戶」。我正在做後者 - 都是正確的(實體明智)。我所說的(或問),是應該以一種查詢被優化並且只處理必要的數據的方式來實現ORM。這不是一個理論上正確的問題(因爲兩種方法都是正確的),而是一個關於ORM實現效率的問題(只使用你需要使用的)。無論如何,感謝您的輸入;) – galchen