主义2 |标准与DQL |表演&可用性

时间:2015-10-31 13:26:41

标签: doctrine-orm dql doctrine-query

我想知道在Doctrine 2中通过复杂查询获取集合的最佳实践是什么。我一直在使用Cirteria匹配功能,但我想知道它是否可用于大型数据库。

$expr = Criteria::expr();
$criteria = Criteria::create();
$criteria->where(
  $expr->andX(
    $expr->gte('start', $start),
    $expr->lte('end', $end)
  )
);

$result = (new ArrayCollection($em->getRepository(Entity::class)->findAll())->matching($criteria);

使用DQL编写的相同过滤器的性能有何不同。

$qb = $em->createQueryBuilder();
$qb->select('e')
    ->from('Entity', 'e')
    ->where('e.start >= :start')
    ->andWhere('e.end <= :end')
    ->setParameters(array('start' => $start, 'end' => $end));

return $qb->getQuery()->getArrayResult();

原生SQL。

$rsm = new ResultSetMapping;
$rsm->addEntityResult('Entity', 'e');

$query = $this->_em->createNativeQuery('SELECT * FROM Entity WHERE start >= ? AND end <= ?', $rsm);
$query->setParameter(1, $start);
$query->setParameter(2, $end);

$result = $query->getResult();

我非常喜欢标准,因为它易于阅读且易于维护。但它可以使用吗?获取1 000,10 000甚至10万条记录时,性能如何受到影响。

第二个问题是Doctrine Criteria是否获取所有结果然后过滤它们还是首先创建特定查询? 文档说明了这一点,但它是否适用于我的案例?

  

&#34;集合有一个过滤API,允许从集合中分割部分数据。如果尚未从数据库加载集合,则过滤API可以在SQL级别上工作,以优化对大型集合的访问。&#34;

     

0 个答案:

没有答案