3

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 の使用方法の学習に 1 日のほとんどを費やし、以下にたどり着きました。

$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 はそれを何らかの方法で処理しますか?

入力していただければ幸いです

4

0 に答える 0