2014-03-25 58 views
0

運作良好的SQL是:DQL LEFT JOIN - SQL示例

SELECT ro.id_role 
     ,rr.id_role_resource 
     ,re.id_resource 
    FROM resource re 
    LEFT JOIN role_resource rr 
     ON rr.resource_id = re.id_resource 
    LEFT JOIN role ro 
     ON ro.id_role = rr.role_id 

現在我必須寫DQL- 這是表瑪:

作用:id_role, name

role_resource:id_role_resource, role_id, resource_id, permission

資源:id_resource, controller,action ...

最後一個表中的

在表role_resource中沒有對應的記錄。 這就是爲什麼我需要這個左邊的在DQL中加入查詢。

+0

你用什麼註釋來映射這個模式到實體? –

+0

那麼,到目前爲止你有什麼,爲什麼它不工作?請注意,不是在vanilla SQL中鏈接'LEFT JOIN'(它可以使有關行的推理在某些查詢中返回有趣)我傾向於選擇'LEFT JOIN(a JOIN b ON ...)ON ...' –

回答

2

一般來說,如果你將有一個Resource實體與$roles屬性和正確標註(OneToManyManyToMany),那麼你的連接表(role_resource)將沒有或不需要和AUTO_INCREMENT ID自身。

這是因爲Doctrine處理關聯信息並根據它們知道何時需要連接表。根據相同的關聯信息加入兩個實體時,Doctrine也知道要使用什麼條件。

因此,如果一個SQL查詢將通過使用2個連接子句通過第三個表連接兩個表,則只需要將DQL查詢告知關聯名稱,並且它將具有所有「連接表」&「連接條件」信息可用。

因此,一個簡單的查詢,看起來像:

SELECT 
     /* i assume $idRole is the name of the property 
     * mapped to the id_role column 
     */ 
     ro.idRole, 

     /* i assume $idResource is the name of the property 
     * mapped to the id_resource column 
     */ 
     re.idResource 

FROM YourNamespace\Resource re 
JOIN re.roles 

具有同等的QueryBuilder語法:

$this->getEntityManager()->createQueryBuilder() 
    ->select(array('ro.idRole', 're.idResource')) 
    ->from('YourNamespace\Resource', 're') 
    ->join('re.roles'); 

JOIN默認爲INNER JOIN,所以我們希望通過重寫查詢,以解決這個問題:

SELECT ro.idRole, 
     re.idResource 
FROM YourNamespace\Resource re 
LEFT JOIN re.roles 

與同等的queryBuilder語法:

$this->getEntityManager()->createQueryBuilder() 
    ->select(array('ro.idRole', 're.idResource')) 
    ->from('YourNamespace\Resource', 're') 
    ->leftJoin('re.roles'); 

然而,如果你想role_resource有它自己的AUTO_INCREMENT ID和在學說查詢訪問,然後主義需要知道關於這個數據表 - 它需要被映射到獨立的實體,你需要明確你加入資源,角色資源和角色的事實。

+0

他有role_resource上的權限列,因此他必須定義RoleResource與Role和Resource具有OneToMany關係的三個實體。 SELECT Role,RoleResource,Resource FROM ...實體\資源資源LEFT JOIN resource.roles roleResource LEFT JOIN roleResource資源 – Cerad

+0

哦,對了! –

0

我需要表role_resource因爲財產的權限是有 SQL代碼工作,但我不能建DQL查詢 RoleResource.php:

/** 
* RoleResource 
* 
* @ORM\Table(name="role_resource", indexes={@ORM\Index(name="fk_role_acl_role1_idx", columns={"role_id"}), @ORM\Index(name="fk_role_acl_acl1_idx", columns={"resource_id"})}) 
* @ORM\Entity(repositoryClass="AuthDoctrineTesty\Entity\Repository\RoleResourceRepository") 
*/ 
class RoleResource 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id_role_resource", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $idRoleResource; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="permission", type="string", length=5, nullable=false) 
    */ 
    private $permission; 

    /** 
    * @var \AuthDoctrineTesty\Entity\Resource 
    * 
    * @ORM\ManyToOne(targetEntity="AuthDoctrineTesty\Entity\Resource") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="resource_id", referencedColumnName="id_resource") 
    * }) 
    */ 
    private $resource; 

    /** 
    * @var \AuthDoctrineTesty\Entity\Role 
    * 
    * @ORM\ManyToOne(targetEntity="AuthDoctrineTesty\Entity\Role") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="role_id", referencedColumnName="id_role") 
    * }) 
    */ 
    private $role; 

我會檢查這個查詢:

SELECT Role,RoleResource,Resource FROM ...Entity\Resource resource LEFT JOIN 
resource.roles roleResource LEFT JOIN roleResource resource 

但是LEFT JOIN中的角色在哪裏? 我知道sql但DQL對我來說有點魔力