2016-02-03 11:28
浏览 40

隐含联接和Doctrine中的位置 - 如何?

I have a ManyToMany relation of Users and Roles. That is I have User table and entity class, Role table and entity and a joining table "user_role" width user_id and role_id columns.

Now, I recently tried to get users with their roles, by using joins, like this:

$qb = $this->createQueryBuilder('u')
    ->join('user_role', 'ur', Join::ON, "I didn't know what to put here, nothing worked ")

Anyway, thanks to this answer I added correct mapping (annotations) to my both entity classes and then removed my own join, letting Doctrine do the job:

$qb = $this->createQueryBuilder('u');
$q = $qb->getQuery();
$users = $q->getResult();

And this works. I have a list of all users, and then I can access their roles (thanks to User->getRoles() method).

However, now I want to list only users having certain roles, for example 'ROLE_ADMIN' and I have no idea how to do this:

$qb = $this->createQueryBuilder('u')
>where('what_to_put_here = :roles')
->setParameter('roles', 'what_to_put_here')

By the way, the SQL code generated by Doctrine looks like this:

SELECT AS id_0, u0_.username AS username_1, u0_.personal_name AS personal_name_2, u0_.password AS password_3, AS email_4, u0_.is_active AS is_active_5 FROM user u0_

So there is no JOIN. From the Doctrine docs I know this is called "lazy load" - the roles of certain user will be fetched on demand.

But then, how can I do something like this:

SELECT * FROM `user` 
JOIN user_role on user_role.user_id =
JOIN role on = user_role.role_id
WHERE role.role_name = 'ROLE_ADMIN'


图片转代码服务由CSDN问答提供 功能建议

我有一个ManyToMany用户和角色的关系。 那就是我有User表和实体类,Role表和实体以及连接表“user_role”width user_id和role_id列。

现在,我最近试图让用户获得他们的角色, 通过使用连接,如下所示:

  $ qb = $ this-> createQueryBuilder('u')
  - > join('user_role','ur', 加入:: ON,“我不知道该放什么,什么都没有用”)

无论如何,多亏了这个回答我添加了正确的映射(注释) 到我的两个实体类然后删除我自己的连接,让Doctrine完成这项工作:

  $ qb = $ this-> createQueryBuilder('u'); 
 $  q = $ qb-> getQuery(); 
 $ users = $ q-> getResult(); 

这样可行。 我有一个所有用户的列表,然后我可以访问他们的角色(感谢User-> getRoles()方法)。


   $ qb = $ this-> createQueryBuilder('u')
>其中('what_to_put_here =:roles')
-> setParameter('roles','what_to_put_here')


  SELECT AS id_0,u0_.username AS  username_1,u0_.personal_name AS personal_name_2,u0_.password AS password_3, AS email_4,u0_.is_active AS is_active_5 FROM user u0_ 

所以没有JOIN 。 从Doctrine文档中我知道这称为“延迟加载” - 某些用户的角色将根据需要获取。


  SELECT * FROM`user` 
JOIN user_role on user_role.user_id = 
JOIN role on = user_role.role_id 
WHERE role.role_name ='ROLE_ADMIN'

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

1条回答 默认 最新

相关推荐 更多相似问题