我正在创建一个使用 Doctrine 2.0 的 Zend Framework 项目
在创建自己的自定义存储库时,我最初在返回结果时“作弊”,而不是通过计算 DQL(或使用 QueryBuilder)来获取结果,我只是使用了模型关联函数:
$apps = new \Doctrine\Common\Collections\ArrayCollection();
foreach ($reseller->getShops() as $currentShop) {
foreach ($currentShop->getProducts() as $product) {
$app = $product->getLicense()->getApplication();
if (!$apps->contains($app))
$apps->add($app);
}
}
我现在大部分时间都在学习 DQL 以及如何使用 QueryBuilder 并得出以下结论:
$shopQuery = $this->getQueryBuilder();
$shopQuery->select('s2.id')
->from('Software2\DEP\Entities\Shop', 's2')
->innerJoin('s.reseller', 'r2')
->where($shopQuery->expr()->eq('r2.id', '?1'));
$appQuery = $this->getQueryBuilder();
$appQuery->select(array('a.name AS application_name', 'l.name AS license_name', 's.name AS shop_name'))
->from('Software2\DEP\Entities\Application', 'a')
->innerJoin('a.licenses', 'l')
->innerJoin('l.shops', 'p')
->innerJoin('p.shop', 's')
->where($appQuery->expr()->in(
's.id',
$shopQuery->getDQL()
)
)
->groupBy('a.name')
->orderBy('a.name', 'ASC');
$appQuery->setParameter(1, $reseller->getId());
...产生以下 DQL:
SELECT a.name AS application_name, l.name AS license_name, s.name AS shop_name FROM Software2\DEP\Entities\Application a INNER JOIN a.licenses l INNER JOIN l.shops p INNER JOIN p.shop s WHERE s.id IN(SELECT s2.id FROM Software2\DEP\Entities\Shop s2 INNER JOIN s.reseller r2 WHERE r2.id = ?1) GROUP BY a.name ORDER BY a.name ASC
经过所有这些努力,我发现运行 QueryBuilder 需要 0.0743 毫秒,而原始(惰性)方法只需要 0.0701 毫秒。我可以通过直接运行生成的 DQL(使用 createQuery)来节省一些时间,这会将它降低到 0.069 毫秒,但是真的值得所有这些努力吗?
我假设惰性(原始)方法会导致更多查询,或者 Doctrine 是否以某种方式处理?
输入赞赏