EC-CUBE3ではSQLを自分で書くことはほとんどありません。代わりに世界的なORM – Object Relational MapperであるDoctrine(ドクトリン)をフルに活用しています。

Doctrineで必ずといっていいほど使用するfindBy(findOneBy)メソッドについて、あまり知られていない第3引数、第4引数とともに使い方をご紹介します。

findByとは?

findByはDoctrine\ORM\EntityRepositoryクラスのメソッドです。EC-CUBEではDBテーブルからデータを取得したい時にはこのレポジトリクラスを起点にします。会員テーブルであればsrc\Eccube\Repository\CustomerRepositoryクラスです。EC-CUBE3のコントローラでは$app[‘eccube.repository.customer’]という形式でアクセスすることができます。

createQueryBuilderを使ってクエリを組み立てていっても良いのですが、シンプルな用途にはfindByという便利メソッドが用意されています。

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#by-simple-conditions

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を書いたりすることもできますのでご安心を!