LoginSignup
24
24

More than 5 years have passed since last update.

DoctrineのDQLと仲良くなるなる方法【その1】

Last updated at Posted at 2015-11-04

Doctrineって便利

みなさん今日も楽しくDoctrine(以降ドク)と仲良くやってますか
初めのころは、こいつ使えねええ!!と正直思ってましたが、DQLを制するものはEC-CUBE3を制す。。。
う~~んなんか今日は文章がさえねえ感じなので早速本題。

必須のメソッド

EC-CUBE3でDQL生成の基本的な事は、こちらの大先生の内容をごらんくだいさい。

Doctrine QueryBuilder使い方メモ

HIDDENキーワード( 呼称が正しいかは不明 )

例えばですが、こんなSQLを発行したとします。

SELECT c, MIN(pc.price02) as price_min, p.id as pid FROM dtb_product AS c INNER JOIN dtb_product_class as pc ON p.id = pc.product_id GROUP BY pid ORDER BY pid ASC;

これをDQLでただ作成するとこんな感じかなと( Repositoryで作成 )

        $qb = $this->createQueryBuilder('p');
        $qb->addSelect('p.id as pid');
        $qb->addSelect('MIN(pc.price02) as price02_min');
        $qb->innerJoin('p.ProductClasses', 'pc');
        $qb->groupBy('p.id');
        $qb->orderBy('price02_min', 'ASC');
        $res = $qb->getQuery()->getResult();

これで完璧じゃんと思って、結果 ( $res ) を見ると、当たり前なんですが、余計なSELECTの内容が結果の配列に追加されていて「Productオブジェクトだけが欲しいのに」って時に残念になります。

$res[0][c] => ( 取得結果Object ) → いい!!
$res[0][pid] => ごにょごにょ →残念
$res[0][price02_min] ごにょごにょ →残念

まあforeachでグリグリして取っ払えばいいですが。。。
健全なプログラマなら。。んんぁっーー無駄ってなると思います。

そんな時に「HIDDEN」の登場

        $qb = $this->createQueryBuilder('p');
        $qb->addSelect('p.id HIDDEN←これ as pid');
        $qb->addSelect('MIN(pc.price02) as HIDDEN←これ price02_min');
        $qb->innerJoin('p.ProductClasses', 'pc');
        $qb->groupBy('p.id');
        $qb->orderBy('price02_min', 'ASC');
        $res = $qb->getQuery()->getResult();

ってすると

$res[0][c] => ( 取得結果Object ) → いい!!!!!!!!!!!

ってんんぁっーーとはなりません。

resetDQLpart

これもスングォイ便利なんですが。。。。
今日は帰りたいのでまた明日追記。。。。。スマン...zzzzzz

......................................................................
おはようございますです!!
さあ朝がきたので、続き仕上げちゃいますです。
でこの「resetDQLpart」ができるやつです

またもや同じソースで説明するです

        $qb = $this->createQueryBuilder('p');
        $qb->addSelect('p.id as pid');
        $qb->addSelect('MIN(pc.price02) as price02_min');
        $qb->innerJoin('p.ProductClasses', 'pc');
        $qb->groupBy('p.id');
        $qb->orderBy('price02_min', 'ASC');

このソースを使いまわして、別の情報を取得するです。
※「検索条件」をそのままで「COUNT」したいとか。。。
そうなるとこの場合ORDER BYが無駄です

その時にこの「resetDQLpart」が登場するです

    //トータル件数を取得
    $counter = clone $qb;
    $counter->resetDQLpart('orderBy');←ここ
    $counter->select('count(pid)');
    $total = counter->getQuery()->getSingleScalarResult();

とすると。。。

「getDQL()」から「str_replace」「preg_replace」などしなくても。
ほれ、もうステキなのです!!
今日は語尾を「です」しばりで書いてみたのですが。。。
次回はまじめにかくです。。

24
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
24