2012-07-08 82 views
1

連接三個表我有三個類型的實體,選擇實體,Doctrine2

  1. 用戶
  2. 網站

用戶可以擁有自己的網站,並他們也可以屬於組 這些實體中的每一個都有一個名字。

這裏是我的Doctrine2定義:

<?php 
/** @Entity */ 
class User 
{ 
    // ... 


    /** 
    * @Column(type="string",length=255,nullable=false) 
    * @var string 
    */ 
    protected $name; 

    /** 
    * @ManyToMany(targetEntity="Group", inversedBy="users") 
    * @JoinTable(name="users_groups") 
    */ 
    private $groups; 

    /** 
    * @ManyToMany(targetEntity="Website", inversedBy="users") 
    * @JoinTable(name="users_websites") 
    */ 
    private $websites; 

    // ... 
} 

/** @Entity */ 
class Group 
{ 
    // ... 

    /** 
    * @Column(type="string",length=255,nullable=false) 
    * @var string 
    */ 
    protected $name; 

    /** 
    * @ManyToMany(targetEntity="User", mappedBy="groups") 
    */ 
    private $users; 



    // ... 
} 

/** @Entity */ 
class Website 
{ 
    // ... 

    /** 
    * @Column(type="string",length=255,nullable=false) 
    * @var string 
    */ 
    protected $name; 

    /** 
    * @ManyToMany(targetEntity="User", mappedBy="websites") 
    */ 
    private $users; 

    // ... 
} 

所以現在,如果我想找到一個所謂的「管理員」組中的所有用戶,我可以這樣做:

$group = $em->getRepository("Group")->findOneByName("Admins"); 
$users = $group->users; 

我還可以得到由做與網站「Google.com」相關聯的所有用戶:

$websites = $em->getRepository("Website")->findOneByName("Google.com"); 
$users = $websites->users; 

現在,如果我要得到誰是我的所有用戶n「管理員」,也與網站「Google」相關聯,我該怎麼辦?

如果我使用的是TSQL,我會加入這三個表,我該如何在Doctrine中做到這一點?

我必須使用DQL嗎? DQL將如何?

回答

2

您應該爲此使用DQL。

SELECT u 
FROM User u 
JOIN u.groups g 
JOIN u.websites w 
WHERE 
    g.name = :group_name 
    AND w.name = :website_name 

而且PHP代碼這樣做:

$dql = '...'; // What i've written above 
$query = $em->createQuery($dql); 
$query->setParameter('group_name', 'Admins'); 
$query->setParameter('website_name', 'Google'); 

$users = $query->getResult(); 

我建議你閱讀學說ORM DQL文件:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html

PS:在兩行代碼你寫的,應該返回組和網站,而不是用戶

+1

謝謝你,我糾正了我的代碼,你的代碼忽略了兩個where子句之間的AND,但是它在糾正之後起作用 – Yasser1984 2012-07-08 17:47:39

+0

你說得對,我已經更新了我的答案 – AdrienBrault 2012-07-08 17:52:14