EC-CUBE3系、4系ではSQLを自分で書くことはほとんどありません。代わりに世界的なORM – Object Relational MapperであるDoctrine(ドクトリン)をフルに活用しています。
Doctrineで必ずといっていいほど使用するfindBy(findOneBy)メソッドについて、あまり知られていない第3引数、第4引数とともに使い方をご紹介します。下の方に4系のtwigでの書き方を記載しています。
findByとは?
findByはDoctrine\ORM\EntityRepositoryクラスのメソッドです。EC-CUBEではDBテーブルからデータを取得したい時にはこのレポジトリクラスを起点にします。会員テーブルであればsrc\Eccube\Repository\CustomerRepositoryクラスです。EC-CUBE3のコントローラでは$app[‘eccube.repository.customer’]という形式でアクセスすることができます。
createQueryBuilderを使ってクエリを組み立てていっても良いのですが、シンプルな用途にはfindByという便利メソッドが用意されています。
findByの使い方
・男性の会員一覧を取得
$Customers = $app[‘eccube.repository.customer’]->findBy(array(‘Sex’ => 1));
最も単純な例で、第一引数にWHEREの条件を配列で設定します。
・男性または女性の会員一覧を取得
$Customers =$app[‘eccube.repository.customer’]->findBy(array(‘Sex’ => array(1, 2)));
条件の値に配列を使うと WHERE ~ IN (1,2)というようにOR検索になります。
・苗字が「山田」という男性の会員一覧を取得
$Customers =$app[‘eccube.repository.customer’]->findBy(array(‘name01’ => ‘山田’, ‘Sex’ => 1));
条件配列に複数の要素を持たせるとAND検索になります。
・男性の会員一覧を登録日が新しい順に取得
$Customers =$app[‘eccube.repository.customer’]->findBy(array(‘Sex’ => 1), array(‘create_date’ => ‘DESC’));
第二引数は並び順を指定することができます。DESCではなくASCにすると古い順になります。
・男性の会員で登録日が新しい10人を取得
$Customers =$app[‘eccube.repository.customer’]->findBy(array(‘Sex’ => 1), array(‘create_date’ => ‘DESC’), 10, 0);
第三引数がlimit(件数)、第四引数は開始位置(offset)になります。SQLでいうLIMIT句として使用されます。
以上のように、findByを使用すると大抵のデータは取得できそうです。EC-CUBE3ではSQLを1行も書く必要がないということは開発効率を考えると非常に重要です。弊社では同じカスタマイズを2系よりも大分少ない工数で実現できるようになりました。
ただし、もっと複雑なクエリが必要な場合はQueryBuiderを使用したり自分でSQLを書いたりすることもできますのでご安心を!
findByをtwigで使う方法
appの配列形式でレポジトリを呼び出せます。
{% set Customers = app[‘eccube.repository.customer’].findBy({‘Sex’ : 1 }, {‘create_date’: ‘DESC’, 10, 0}) %}
EC-CUBE4でのfindByの使い方
・Controllerで使用
基本的な考え方は同じで、それぞれのテーブル用のレポジトリからfindByを使用します。$this->customerRepositoryなど使用したいレポジトリは、Controllerの__constructで代入しておく必要があります。
$Customers =$this->customerRepository->findBy(array(‘Sex’ => 1), array(‘create_date’ => ‘DESC’), 10, 0);
代入が面倒な場合は下記のようにもできます。
$this->entityManager->getRepository(\Eccube\Entity\Customer::class)>findBy(array(‘Sex’ => 1), array(‘create_date’ => ‘DESC’), 10, 0);
・twigで使用
4系でもtwig上でrepositoryを呼び出すことができます。
{% set Customers =repository('Eccube\\Entity\\Customer').findBy(
{'Sex' : 1 },
{'create_date': 'DESC'},
10,
0
) %}
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。