原则使用多查询来预取外部实体


Doctrine dql manytomany query to pre fetch foreighn entitties

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

在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

那么问题是:我如何只选择某些用户字段,并在用户记录中拥有原则巢角色而不抛出错误?

发得太早了,抱歉。

这个错误是很常见的,许多SO的答案并不适用于我的情况,但这一个。

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

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