SQLを書き換える†この方法は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文を確認する†この方法はEC-CUBE4系でも使えます。 dump($qb->getQuery()->getSQL()); パラメーターの確認 dump($qb->getQuery()->getParameters()); 論理削除のデータを取得する†この方法はEC-CUBE3系だけで使えます。 一時的にフィルタを無効化してデータを取得します。 $filters = $app['orm.em']->getFilters()->disable('soft_delete');
$results = $qb->getResult();
$filters = $app['orm.em']->getFilters()->enable('soft_delete');
フィルタは以下のファイルにて適用されています。 // 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関数を使用したい†拡張すれば利用できるようになります。 こちらを参考にさせていただきました。 Symfony2【Doctrine DQL関数拡張】MySQL(PostGreSQL)のNOW,ROUND,FLOOR,GROUP_CONCAT等の関数を使用(EC-CUBE3) |