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

関連するカスタマイズ

Doctorineで設定できるフィールドタイプ... EC-CUBE3が採用しているSymfonyの標準ORM、Doctorineで設定できるフィールドタイプをまとめました。 EC-CUBE3で開発するならこれはもう覚えちゃっても良いかもしれませんね。 dcm.ymlやマイグレーションで頻繁に使いますからね。 stringやintegerのよ...
商品情報に項目を追加する方法 EC-CUBE3で商品に項目を追加したいというご要望が多く寄せられています。 今回はプラグインを使用せずに商品情報へメーカー名(テキスト)を追加する方法をご紹介します。この手順を守って実施すると各ステップでエラーが起きないためおすすめです。ステップごとに問題が発生しないかどうか確認してみてくだ...
Catchable Fatal Error: Object of class DateTime co... EC-CUBE3のTwigテンプレートで{{ Order.order_date }}のように書き受注日時を表示しようとすると、Catchable Fatal Errorが出ることがあります。 Twig_Error_Runtime in Template.php line 182: An ex...
ドクトリンで用いられるエンティティとレポジトリとは?... EC-CUBE3やEC-CUBE4で開発を行なっていると必ず耳にするのがドクトリンやエンティティ、レポジトリといったデータベース周りの用語です。 ECサイトはデータベースと密接に関係しているため、これらを用いずにEC-CUBEの開発を行うことは不可能です。 エンティティとレポジトリとは? ...