隐式连接和教义中的位置 - 如何?

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。