2014-03-25 66 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对我来说有点魔力