这是我使用查询生成器的查询,它运行良好,带来了用户表和模块表的所有结果,它们具有多对多关联:
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.
列。