Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 隐式连接和原则中的何处-如何?_Php_Symfony_Doctrine Orm_Symfony 2.3 - Fatal编程技术网

Php 隐式连接和原则中的何处-如何?

Php 隐式连接和原则中的何处-如何?,php,symfony,doctrine-orm,symfony-2.3,Php,Symfony,Doctrine Orm,Symfony 2.3,我有很多用户和角色的关系。也就是说,我有用户表和实体类、角色表和实体以及连接表“User\u Role”宽度User\u id和Role\u id列 现在,我最近尝试通过使用连接让用户使用他们的角色,如下所示: $qb = $this->createQueryBuilder('u') ->join('user_role', 'ur', Join::ON, "I didn't know what to put here, nothing worked ") SELECT u0

我有很多用户和角色的关系。也就是说,我有用户表和实体类、角色表和实体以及连接表“User\u Role”宽度User\u id和Role\u id列

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

$qb = $this->createQueryBuilder('u')
    ->join('user_role', 'ur', Join::ON, "I didn't know what to put here, nothing worked ")
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_
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'
无论如何,由于答案,我在两个实体类中添加了正确的映射(注释),然后删除了我自己的连接,让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')
顺便说一下,条令生成的SQL代码如下所示:

$qb = $this->createQueryBuilder('u')
    ->join('user_role', 'ur', Join::ON, "I didn't know what to put here, nothing worked ")
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_
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'
所以没有加入。从Doctrine文档中,我知道这被称为“延迟加载”——特定用户的角色将根据需要获取

但是,我该怎么做呢

$qb = $this->createQueryBuilder('u')
    ->join('user_role', 'ur', Join::ON, "I didn't know what to put here, nothing worked ")
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_
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\u name映射为实体中的属性roleName。

谢谢,但这会导致[Semantical Error]第0行,第67列靠近“role\u name=”:错误:Class AppBundle\entity\role没有名为role\u name的字段或关联:(这是因为在类中它被称为roleName吗?(用驼峰大小写代替下划线)但在数据库中我使用下划线,因为我相信这是在Symfony中开发时的标准,对吗?那么我能做些什么呢?我的意思是这次我可以简单地将它重命名为“name”而不是“role\u name”但我不认为这是最好的方法……我的意思是,下一次可能需要不止一个单词。我在类Role中添加了getrole\u name方法,但没有任何更改。?您能帮忙吗?Hi@konrad\u事务所,请密切注意您在WHERE子句中使用的名称。您必须使用映射到实体的名称,而不是列名称。例如,如果将列role_name映射为roleName,则where show为r.roleName。我在这个答案中发现了另一个错误,现在正在编辑它。有两个错误:列名而不是属性名。参数名与占位符不匹配。我只是更改了参数名以更好地区分列/属性名称:)