[[EC-CUBEめも]]

*SQLを書き換える [#tab40f53]

この方法はEC-CUBE4系でも使えます。

EC-CUBE本体で生成しているSQL文をプラグイン側で変更したい場合は、フックポイントで受け取ったQueryBuilderを getDQLPart() や resetDQLPart() を使用して書き換えることができます。

WHERE句を取得したい場合
 dump($qb->getDQLPart('where'));

WHERE句をリセットしたい場合
 $qb->resetDQLPart('where');

ORDER BY句をリセットしたい場合
 $qb->resetDQLpart('orderBy');

WHERE句の内容を付け替える場合
 // WHERE句を保持
 $whereParts = $qb->getDQLPart('where')->getParts();
 
 // WHERE句をリセット
 $qb->resetDQLPart('where');
 
 foreach ($whereParts as $part) {
     // name検索を付け替え
     if (strpos($part, 'NORMALIZE(p.name)') !== false) {
         $qb->andWhere('1 = 1');
     } else {
         $qb->andWhere($part);
     }
 }

getDQL() で取得してstr_replaceなどで書き換えられるかもしれない。

*実行されるSQL文を確認する [#qabda924]

この方法はEC-CUBE4系でも使えます。

 dump($qb->getQuery()->getSQL());

パラメーターの確認

 dump($qb->getQuery()->getParameters());

*論理削除のデータを取得する [#t5895d81]

この方法はEC-CUBE3系だけで使えます。

一時的にフィルタを無効化してデータを取得します。~
取得後はフィルタを有効に戻します。

 $filters = $app['orm.em']->getFilters()->disable('soft_delete');
 
 $results = $qb->getResult();
 
 $filters = $app['orm.em']->getFilters()->enable('soft_delete');

フィルタは以下のファイルにて適用されています。~
src/Eccube/ServiceProvider/EccubeServiceProvider.php

 // filters
 $config = $em->getConfiguration();
 $config->addFilter("soft_delete", '\Eccube\Doctrine\Filter\SoftDeleteFilter');
 $config->addFilter("nostock_hidden", '\Eccube\Doctrine\Filter\NoStockHiddenFilter');
 $config->addFilter("incomplete_order_status_hidden", '\Eccube\Doctrine\Filter\OrderStatusFilter');
 $em->getFilters()->enable('soft_delete');

*CAST関数を使用したい [#d4a1db0c]

拡張すれば利用できるようになります。

こちらを参考にさせていただきました。~
ありがとうございます。

Symfony2【Doctrine DQL関数拡張】MySQL(PostGreSQL)のNOW,ROUND,FLOOR,GROUP_CONCAT等の関数を使用(EC-CUBE3)~
https://webcode-lab.com/topics/blogid/24/

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS