首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何加入DQL

如何加入DQL
EN

Stack Overflow用户
提问于 2014-03-11 20:39:36
回答 1查看 69关注 0票数 0

我正在尝试使用DQL查询来获取用户及其相关角色。为了检查为什么我不能使用symfony2教程获得用户角色。

provider.html

这些是桌子..。

用户表:

代码语言:javascript
复制
+----------+--------------+------+-----+---------+----------------+
| 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表:

代码语言:javascript
复制
+---------+---------+------+-----+---------+-------+
| Field   | Type    | Null | Key | Default | Extra |
+---------+---------+------+-----+---------+-------+
| user_id | int(11) | NO   | PRI | NULL    |       |
| role_id | int(11) | NO   | PRI | NULL    |       |
+---------+---------+------+-----+---------+-------+

角色表:

代码语言:javascript
复制
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| role  | varchar(255) | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

这就是我试图在UserRepository中实现的方法:

代码语言:javascript
复制
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;
}

得到这个结果..。

代码语言:javascript
复制
+----------+------------+
| username | role       |
+----------+------------+
| admin    | ROLE_ADMIN |
| admin    | ROLE_USER  |
+----------+------------+

想要这个..。

代码语言:javascript
复制
+----------+------------+
| username | role       |
+----------+------------+
| admin    | ROLE_ADMIN |
+----------+------------+

我知道如何使用SQL语句获得这个结果,但不知道如何使用DQL。

SQL查询:

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-11 23:11:37

问题似乎存在于您的实体中。您需要向实体添加适当的注释,如果您希望DQL能够正常工作,那么它的设计就是为了工作。

似乎你正面临着一个经典的一对多的单向问题:

例如:

Users.php

代码语言:javascript
复制
<?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的问题,比如:

代码语言:javascript
复制
$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的文档告诉您使用:

代码语言:javascript
复制
/**
 * ManyToMany(targetEntity="Role")
 */

然后在symfony中,你必须把它写成:

代码语言:javascript
复制
/**
 * @ORM\ManyToMany(targetEntity="Role")
 */

否则就没用了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22336154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档