我正在尝试优化查询,尝试选择较少的可能值。 例如,我有一个实体“Anagrafic”,其中包含您的姓名,地址,城市等, 以及我只想更改其中一个字段的表单,例如地址。 我创建了这个查询:
//AnagraficRepository
public function findAddress($Id)
{
$qb = $this->createQueryBuilder('r')
->select('r.address')
->where('r.id = :id')
->setParameter('id', $Id)
->getQuery();
return $qb->getResult();
}
此查询有问题,因为我没有返回任何值,但是如果我正常执行查询:
//Controller
$entity = $em->getRepository('MyBusinessBundle:Anagrafic')->find($id);
返回正确的值。 如何仅选择一列进行查询?
答案 0 :(得分:13)
由于您要求每条记录的单列,您必然会遇到array
。话虽如此,您应该将getResult
替换为getArrayResult()
,因为您无法强制执行对象保湿:
$data = $qb->getArrayResult();
Now, you have structure:
$data[0]['address']
$data[1]['address']
....
希望这会有所帮助。
关于评论中的性能的讨论,我通常同意你的意思,因为不希望每次都进行30次列提取。但是,在这种情况下,您应该考虑编写命名查询,以便在数据库被更改时将影响降至最低。
答案 1 :(得分:7)
您可以使用partial objects仅水合一个字段并仍然返回一个对象。
答案 2 :(得分:3)
这对我有用:
$qb = $repository->createQueryBuilder('i')
->select('i.name')
->...
答案 3 :(得分:2)
使用这样的部分对象来选择字段
$qb = $this->createQueryBuilder('r')
->select(array('partial r.{id,address}'))
...
将字段名称放在方括号
之间