我想知道在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;