6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

EC-CUBE4のQueryCustomizerでOR条件を追加したい場合

Posted at

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;
    }
}

間違い、もっといい方法があればコメントいただけますと助かります。

6
7
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
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?