我正在尝试使用DQL查询来获取用户及其相关角色。为了检查为什么我不能使用symfony2教程获得用户角色。
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;发布于 2014-03-11 23:11:37
问题似乎存在于您的实体中。您需要向实体添加适当的注释,如果您希望DQL能够正常工作,那么它的设计就是为了工作。
似乎你正面临着一个经典的一对多的单向问题:
例如:
Users.php
<?php
/**
*@ORM\Table("Users")
*@ORM\Entity
*/
class Users {
/**
* @ORM\ManyToMany(targetEntity="Role")
* @ORM\JoinTable(name="users_roles",
* joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="role_id", referencedColumnName="id")}
* )
*/
private $roles;
public function __construct() {
$this->roles = new ArrayCollection();
}
}那么,这应该只是写一个DQL的问题,比如:
$query = $em->createQuery('
SELECT
u.username, u.roles.role
FROM
TestLoginBundle:User u
WHERE
u.username = :user
')->setParameter('user', $name);为了得到你想要的结果。
阅读Doctrine文档中的以下一页:
http://docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html
它们提供了比上面所示的更深入和全面的例子。但是,如果您计划在Symfony中使用这些示例。记住将@ORM\放在Doctrine文档中显示的所有注释的前面。
例如,如果Doctrine的文档告诉您使用:
/**
* ManyToMany(targetEntity="Role")
*/然后在symfony中,你必须把它写成:
/**
* @ORM\ManyToMany(targetEntity="Role")
*/否则就没用了。
https://stackoverflow.com/questions/22336154
复制相似问题