Doctrine2:[语义错误] 不能 select 实体通过标识变量而不选择至少一个根实体别名

Doctrine2: [Semantical Error] Cannot select entity through identification variables without choosing at least one root entity alias

这是我使用查询生成器进行的查询,它完美地工作,带来了用户 table 和模块 table 的所有结果,它们具有多对多关联:

public function getUser($id){
    $qb = $this->getEm()->createQueryBuilder()
    ->select('u', 'm')
    ->from('Adm\Entity\User', 'u')
    ->join('u.modules', 'm')
    ->where('u.id = ?1')
    ->setParameters(array(1 => $id));
    $result = $qb->getQuery()->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);
    return $result;
}

但是当我尝试 select 来自用户的特定字段时:

public function getUser($id){
    $qb = $this->getEm()->createQueryBuilder()
    ->select('u.id, u.name, u.email', 'm')
    ->from('Adm\Entity\User', 'u')
    ->join('u.modules', 'm')
    ->where('u.id = ?1')
    ->setParameters(array(1 => $id));
    $result = $qb->getQuery()->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);
    return $result;
}

Doctrine 抛出一个错误:

[Semantical Error] line 0, col -1 near 'SELECT u.id,': Error: Cannot select entity through identification variables without choosing at least one root entity alias.

我想知道如何做到这一点,select 实体中的特定字段而不是所有字段。

您的第二个查询的问题是您正在尝试 return 关联的 modules 对象而不是 User 对象。教义不喜欢这样,也不会这样运作。我知道您尝试过对数组进行水合,但如果没有,这就是您的第一个查询要尝试的 return:

User object {
    ...,
    $modules -> array of Module objects
}

所以您 return 一个单一的用户对象,然后您的 $modules 用户 class 成员将成为所有关联模块对象的数组。即使你正在 selecting u, m,Doctrine 仍然想要 return 那个对象,因为 m 只是 u 上的一个关联。仅仅因为您想水化数组并不会改变 Doctrine 希望 select 您的数据开始的方式。

你的第二个例子 - Doctrine 不知道如何return。通过单独 selecting User 字段,您不再 returning 一个 User 对象,而是一组 User 值。那么,它在哪里甚至可以 return 关联模块呢? return 这种格式没有意义:

[
    user id,
    user name,
    user email,
    [ array of Module objects ]
]

作为多对多关联,这甚至更棘手。真正的问题是,如果您发现第一个查询不可接受,您要用第二个查询完成什么?如果它的性能,你可能不会从第二个查询中获得太多。如果它只是 return 特定列,那么您也应该指定那些 m. 列。