EC-CUBE4のリポジトリのカスタマイズについてはまずこちらの公式ドキュメントをご確認ください。
AND条件であればEC-CUBE4自体が提供しているカスタマイズ機構で簡単にカスタマイズが可能です。
例えば note
が空の商品のみ検索結果に表示したい場合は以下のように WhereCustomizer
を拡張してやることで検索条件を追加できます。
<?php
namespace Customize\Repository;
use Eccube\Doctrine\Query\WhereClause;
use Eccube\Doctrine\Query\WhereCustomizer;
use Eccube\Repository\QueryKey;
class ProductListWhereCustomizer extends WhereCustomizer
{
/**
* @inheritDoc
*/
public function getQueryKey()
{
return QueryKey::PRODUCT_SEARCH;
}
/**
* @inheritDoc
*/
protected function createStatements($params, $queryKey)
{
// noteが空の商品のみ検索結果に表示
return [WhereClause::isNull('p.note')];
}
}
さて、問題はOR条件をどうやってしているするかですが、 WhereCustomizer
に AND, OR のメソッドが用意されていないので、 QueryCustomizer
を直接実装してやる必要があります。
例えば「 note
が空またはログイン中の会員番号」の商品のみ検索結果に表示したい場合は以下のように QueryCustomizer
を実装します。
<?php
namespace Customize\Repository;
use Doctrine\ORM\QueryBuilder;
use Eccube\Doctrine\Query\QueryCustomizer;
use Eccube\Repository\QueryKey;
use Eccube\Request\Context;
class ProductListWhereCustomizer implements QueryCustomizer
{
/**
* @var Context
*/
private $context;
/**
* ProductListWhereCustomizer constructor.
*
* @param Context $context
*/
public function __construct(Context $context)
{
$this->context = $context;
}
/**
* {@inheritdoc}
*/
public function customize(QueryBuilder $builder, $params, $queryKey)
{
// noteが空またはログイン中の会員番号の商品のみ検索結果に表示
$Customer = $this->context->getCurrentUser();
if (is_null($Customer)) {
$builder
->andWhere('p.note IS NULL');
} else {
$builder
->andWhere('p.note = :Note OR p.note IS NULL')
->setParameter('Note', $Customer->getId());
}
}
/**
* {@inheritdoc}
*/
public function getQueryKey()
{
return QueryKey::PRODUCT_SEARCH;
}
}
間違い、もっといい方法があればコメントいただけますと助かります。