隐式连接和教义中的位置 - 如何?
Implicit joins and Where in Doctrine - how?
我有用户和角色的多对多关系。那就是我有用户 table 和实体 class、角色 table 和实体以及连接 table "user_role" 宽度 user_id 和 role_id 列。
现在,我最近尝试通过使用联接来让用户具有他们的角色,如下所示:
$qb = $this->createQueryBuilder('u')
->join('user_role', 'ur', Join::ON, "I didn't know what to put here, nothing worked ")
无论如何,感谢 的回答,我向我的两个实体 classes 添加了正确的映射(注释),然后删除了我自己的连接,让 Doctrine 完成工作:
$qb = $this->createQueryBuilder('u');
$q = $qb->getQuery();
$users = $q->getResult();
这行得通。我有一个所有用户的列表,然后我可以访问他们的角色(感谢 User->getRoles() 方法)。
但是,现在我只想列出具有特定角色的用户,例如 'ROLE_ADMIN',但我不知道该怎么做:
$qb = $this->createQueryBuilder('u')
>where('what_to_put_here = :roles')
->setParameter('roles', 'what_to_put_here')
顺便说一下,Doctrine 生成的 SQL 代码如下所示:
SELECT u0_.id AS id_0, u0_.username AS username_1, u0_.personal_name AS personal_name_2, u0_.password AS password_3, u0_.email AS email_4, u0_.is_active AS is_active_5 FROM user u0_
所以没有JOIN。从 Doctrine 文档我知道这叫做 "lazy load" - 某些用户的角色将按需获取。
但是,我怎么能这样做:
SELECT * FROM `user`
JOIN user_role on user_role.user_id = user.id
JOIN role on role.id = user_role.role_id
WHERE role.role_name = 'ROLE_ADMIN'
?
使用这个:
$qb = $this->createQueryBuilder('u')
->innerJoin('u.roles', 'r')
->where('r.roleName = :roleNameParameter')
->setParameter('roleNameParameter', 'ROLE_ADMIN');
我假设您将列 role_name 映射为实体中的 属性 roleName。
我有用户和角色的多对多关系。那就是我有用户 table 和实体 class、角色 table 和实体以及连接 table "user_role" 宽度 user_id 和 role_id 列。
现在,我最近尝试通过使用联接来让用户具有他们的角色,如下所示:
$qb = $this->createQueryBuilder('u')
->join('user_role', 'ur', Join::ON, "I didn't know what to put here, nothing worked ")
无论如何,感谢
$qb = $this->createQueryBuilder('u');
$q = $qb->getQuery();
$users = $q->getResult();
这行得通。我有一个所有用户的列表,然后我可以访问他们的角色(感谢 User->getRoles() 方法)。
但是,现在我只想列出具有特定角色的用户,例如 'ROLE_ADMIN',但我不知道该怎么做:
$qb = $this->createQueryBuilder('u')
>where('what_to_put_here = :roles')
->setParameter('roles', 'what_to_put_here')
顺便说一下,Doctrine 生成的 SQL 代码如下所示:
SELECT u0_.id AS id_0, u0_.username AS username_1, u0_.personal_name AS personal_name_2, u0_.password AS password_3, u0_.email AS email_4, u0_.is_active AS is_active_5 FROM user u0_
所以没有JOIN。从 Doctrine 文档我知道这叫做 "lazy load" - 某些用户的角色将按需获取。
但是,我怎么能这样做:
SELECT * FROM `user`
JOIN user_role on user_role.user_id = user.id
JOIN role on role.id = user_role.role_id
WHERE role.role_name = 'ROLE_ADMIN'
?
使用这个:
$qb = $this->createQueryBuilder('u')
->innerJoin('u.roles', 'r')
->where('r.roleName = :roleNameParameter')
->setParameter('roleNameParameter', 'ROLE_ADMIN');
我假设您将列 role_name 映射为实体中的 属性 roleName。