【发布时间】:2014-03-11 20:39:36
【问题描述】:
我正在尝试使用 DQL 查询获取用户及其关联的角色。为了检查为什么我无法使用 symfony2 教程获取用户角色。
http://symfony.com/doc/current/cookbook/security/entity_provider.html
这些是表格...
用户表:
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(255) | NO | | NULL | |
| password | varchar(255) | NO | | NULL | |
+----------+--------------+------+-----+---------+----------------+
user_role 表:
+---------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------+------+-----+---------+-------+
| user_id | int(11) | NO | PRI | NULL | |
| role_id | int(11) | NO | PRI | NULL | |
+---------+---------+------+-----+---------+-------+
角色表:
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| role | varchar(255) | NO | | NULL | |
+-------+--------------+------+-----+---------+----------------+
这是我试图在 UserRepository 中实现的方法:
public function findRolesByUsername($name) {
$em = $this->getEntityManager();
$query = $em->createQuery('SELECT u.username, r.role
FROM TestLoginBundle:User u
JOIN TestLoginBundle:Role r
WHERE u.username = :user')
->setParameter('user', $name);
$result = $query->getResult();
return $result;
}
得到这个结果...
+----------+------------+
| username | role |
+----------+------------+
| admin | ROLE_ADMIN |
| admin | ROLE_USER |
+----------+------------+
想要这个……
+----------+------------+
| username | role |
+----------+------------+
| admin | ROLE_ADMIN |
+----------+------------+
我知道如何使用 SQL 语句获得此结果,但不知道如何使用 DQL。
SQL 查询:
SELECT u.username, r.role
FROM User u
JOIN user_role ur
ON u.id = ur.user_id
JOIN Role r
ON ur.role_id = r.id;
【问题讨论】:
-
仅供参考 $this->getEntityManager() 已被弃用并可以通过 $this->getManager(); 替换不过很快就回答了……
-
或者在你运行上述查询之前 $name 的值是多少。
-
我在 EntityRepository 中调用 DQL 查询,因此“getManager()”不起作用。反正这不是重点。我在询问如何使用 DQL 查询获得特定结果。
-
$this->getDoctrine()->getManager();在 EntityRepository 中。这都是相对的,即使这不是您要寻找的答案。就像我如何告诉某人他们的 SQL 是可注入的,即使他们没有询问它是否是,等等。弃用的函数离被删除函数只有一步之遥。我询问了 $name 值,因为如果为 false,它将返回所有行,这就是正在发生的事情。
-
您可以随时转储正在发生的实际 sql 查询。