原则2:[语义错误]如果不选择至少一个根实体别名,则无法通过标识变量选择实体



这是我使用查询生成器的查询,它运行良好,带来了用户表和模块表的所有结果,它们具有多对多关联:

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

但是当我尝试像这样从用户中选择特定字段时:

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

教义抛出了一个错误:

[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.

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

第二个查询的问题在于您尝试返回关联的modules对象,而不是User对象。 教义不喜欢这样,也不会这样运作。 我知道你试图水化一个数组,但如果你没有,这就是你的第一个查询将尝试返回的内容:

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

因此,您将返回单个 User 对象,然后该 User 类的$modules成员将是所有关联模块对象的数组。 即使你选择了u, m,Doctrine仍然希望返回一个对象,m因为它只是u上的一个关联。 仅仅因为您想对数组进行水合,并不会改变 Doctrine 想要选择数据的方式。

你的第二个例子 - 教义不知道如何返回它。 通过单独选择 User 字段,您不再返回 User 对象,而是返回 User 值数组。 那么,它甚至可以在哪里返回相关模块呢? 返回此格式没有意义:

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

作为多对多关联,这更加棘手。 真正的问题是,您试图通过第二个查询完成什么,而您在第一个查询中无法接受? 如果是性能,则第二个查询可能不会获得太多收益。 如果它只是返回特定的列,那么您也应该指定这些列m.列。

最新更新