Doctrineって便利
みなさん今日も楽しくDoctrine(以降ドク)と仲良くやってますか
初めのころは、こいつ使えねええ!!と正直思ってましたが、DQLを制するものはEC-CUBE3を制す。。。
う~~んなんか今日は文章がさえねえ感じなので早速本題。
必須のメソッド
EC-CUBE3でDQL生成の基本的な事は、こちらの大先生の内容をごらんくだいさい。
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」などしなくても。
ほれ、もうステキなのです!!
今日は語尾を「です」しばりで書いてみたのですが。。。
次回はまじめにかくです。。