リポジトリのカスタマイズ
QueryBuilderの拡張 #2285, #2298
リポジトリクラスで QueryBuilder を生成しているメソッドに対して、ソート順や検索条件をカスタマイズできます。 以下のメソッドで使用できます。
リポジトリクラス | QueryKey |
---|---|
ProductRepository::getQueryBuilderBySearchData() | QueryKey::PRODUCT_SEARCH |
ProductRepository::getQueryBuilderBySearchDataForAdmin() | QueryKey::PRODUCT_SEARCH_ADMIN |
ProductRepository::getFavoriteProductQueryBuilderByCustomer() | QueryKey::PRODUCT_GET_FAVORITE |
CustomerRepository::getQueryBuilderBySearchData() | QueryKey::CUSTOMER_SEARCH |
OrderRepository::getQueryBuilderBySearchData() | QueryKey::ORDER_SEARCH |
OrderRepository.getQueryBuilderBySearchDataForAdmin() | QueryKey::ORDER_SEARCH_ADMIN |
OrderRepository::getQueryBuilderByCustomer() | QueryKey::ORDER_SEARCH_BY_CUSTOMER |
LoginHistoryRepository::getQueryBuilderBySearchDataForAdmin() | QueryKey::LOGIN_HISTORY_SEARCH_ADMIN |
※ QueryKey::LOGIN_HISTORY_SEARCH_ADMIN
は EC-CUBE 4.1 以降
カスタマイズするためのインターフェイスとしては以下を提供しています。
インターフェイス/クラス | 概要 |
---|---|
QueryCustomizer | QueryBuilderを自由に変更 |
OrderByCustomizer | ソート順を変更する |
WhereCustomizer | 検索条件を追加する |
JoinCustomizer | 結合するテーブルを追加する |
実装例
ProductRepository::getQueryBuilderBySearchDataForAdmin()
において、常に商品IDでソートするサンプルです。
getQueryKey()
メソッドで、適用したいメソッドを指定することで、自動的に有効になります。
<?php
namespace Customize\Repository;
use Eccube\Doctrine\Query\OrderByClause;
use Eccube\Doctrine\Query\OrderByCustomizer;
use Eccube\Repository\QueryKey;
class AdminProductListCustomizer extends OrderByCustomizer
{
/**
* 常に商品IDでソートする。
*
* @param array $params
* @param $queryKey
* @return OrderByClause[]
*/
protected function createStatements($params, $queryKey)
{
return [new OrderByClause('p.id')];
}
/**
* ProductRepository::getQueryBuilderBySearchDataForAdmin に適用する.
*
* @return string
* @see \Eccube\Repository\ProductRepository::getQueryBuilderBySearchDataForAdmin()
* @see QueryKey
*/
public function getQueryKey()
{
return QueryKey::PRODUCT_SEARCH_ADMIN;
}
}