php - 隐式连接和原则中的位置 - 如何?

标签 php symfony doctrine-orm symfony-2.3

我有用户和角色的多对多关系。也就是说,我有用户表和实体类、角色表和实体以及连接表“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 ")

无论如何,感谢 this我向两个实体类添加了正确的映射(注释),然后删除了我自己的连接,让 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 文档中我知道这称为“延迟加载” - 将按需获取特定用户的角色。

但是,我怎样才能做这样的事情:

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。

关于php - 隐式连接和原则中的位置 - 如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35175779/

相关文章:

php - 关系数据库设计 - 规范化和关系

php - 如何解决在 apache 上找不到 favicon.ico 错误

symfony - 在 Symfony2 中组织业务逻辑

php - Doctrine Cascade Delete OneToMany 自引用

mysql - 如何在 Doctrine 中转义单引号

php - 如何阻止 CakePHP 在输出中放置注释标签

php - 如何获取 php 键作为 php 数组中的值

php - 为什么使用相同的盐和密码调用 encodePassword()(或 hashPasswor())会在 Symfony 中产生不同的哈希值?

javascript - 将参数从 angularJs 发送到 php symfony2 api

php - 在 Symfony/Doctrine DBAL 中捕获预执行事件