Doctrine dql manytomany查询预取外来实体

时间:2014-07-14 07:31:41

标签: php symfony doctrine-orm dql

我有一个用户实体和角色实体。用户可以拥有多个角色,角色可以拥有许多用户。 (我认为)重要的部分如下:

在User.php中

/**
 * @ORM\ManyToMany(targetEntity="Role",inversedBy="users")
 * @ORM\JoinTable(name="user_role",
 *      joinColumns={@ORM\JoinColumn(name="userid", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="roleid", referencedColumnName="id")}
 *      )
 */
protected $roles;
public function __construct(){
    $this->roles = new ArrayCollection();
}

在Role.php中:

/**
 * @ORM\ManyToMany(targetEntity="User", mappedBy="roles")
 * @ORM\JoinTable(name="user_role",
 *      joinColumns={@ORM\JoinColumn(name="roleid", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="userid", referencedColumnName="id")}
 *      )
 */
protected $users;
public function __construct(){
    $this->users = new ArrayCollection();
}

尝试以下查询为我提供了一个用户,可以将其ID和名称字段替换为角色ID和名称

$result = $this->getEntityManager()->createQuery('SELECT 
    u.id, u.username, u.name, u.email, r.id, r.name
    FROM mytestBundle:User u
    LEFT JOIN u.roles r
    WHERE u.id = :id')
        ->setParameter('id', $id)
        ->getArrayResult();

以下内容给出了一个错误:Error: Cannot select entity through identification variables without choosing at least one root entity alias.

$result = $this->getEntityManager()->createQuery('SELECT 
    u.id, u.name, r
    //... rest is same

以下为我提供了我期望的结果,但包含太多用户字段。观看另一个用户的个人资料的一个用户无法看到用户的电子邮件,密码,盐,......但是可以看到该用户的角色:

$result = $this->getEntityManager()->createQuery('SELECT 
    u, r

所以问题是:如何只选择某些用户字段并在用户记录中使用doctrine nest Roles而不会抛出错误?

1 个答案:

答案 0 :(得分:0)

发布得太早,抱歉。

这个错误很常见,许多SO答案不适用于我的情况,但this one确实如此。

使用部分解决了我的问题:

$result = $this->getEntityManager()->createQuery('SELECT 
    partial u.{id, name}, r