【问题标题】:Symfony2 Select one column in doctrineSymfony2 在学说中选择一列
【发布时间】:2013-02-09 09:54:39
【问题描述】:

我正在尝试优化查询以选择更少的可能值​​.. 例如,我有一个实体“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);

返回正确的值。 如何只选择一列进行查询?

【问题讨论】:

  • 我的目标是减小查询的大小,返回单列比30列在性能上要好很多!
  • 那你会到处做吗?在这种情况下,我最好将您的桌子与其他几张桌子分开。
  • 我认为这是提高性能的好方法!如果你不同意也没关系..

标签: symfony doctrine-orm symfony-2.1


【解决方案1】:

您可以使用partial objects 仅对一个字段进行水合,并且仍然返回一个对象。

【讨论】:

【解决方案2】:

这对我有用:

  $qb = $repository->createQueryBuilder('i')
    ->select('i.name')
    ->...

【讨论】:

    【解决方案3】:

    使用像这样的部分对象来选择字段

    $qb = $this->createQueryBuilder('r')
        ->select(array('partial r.{id,address}'))
        ...
    

    把你的字段名放在括号内

    【讨论】:

    【解决方案4】:

    由于您请求每条记录的单列,因此您一定会期待一个array。话虽如此,您应该将 getResult 替换为 getArrayResult(),因为您无法强制对象水合:

    $data = $qb->getArrayResult();
    Now, you have structure:
        $data[0]['address']
        $data[1]['address']
        ....
    

    希望这会有所帮助。

    至于关于 cmets 性能的讨论,我通常同意您的看法,即不希望每次都获取所有 30 列。但是,在这种情况下,您应该考虑编写命名查询,以便在数据库被更改时将影响降至最低。

    【讨论】:

    • 真的非常感谢您的帮助!正是我正在寻找的信息!
    猜你喜欢
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 2013-07-31
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    相关资源
    最近更新 更多