QueryBuilder的优点与Doctrine 2.0中的延迟加载

时间:2012-04-30 15:56:10

标签: performance zend-framework doctrine-orm doctrine-query

我正在创建一个使用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.0743ms,而原始(懒惰)方法只花费0.0701ms。我可以通过直接运行生成的DQL(使用createQuery)来节省一些时间,这可以将它降低到0.069ms,但它真的值得所有努力吗?

我认为懒惰(原始)方法会导致更多查询,或者Doctrine会以某种方式处理它?<​​/ p>

输入赞赏

0 个答案:

没有答案