【EC-CUBE 4】商品データベースの簡単な検索方法

【トップ画面】Repositoryの検索メソッドまとめ

「find」や「findBy」など、データベースから任意のデータ(レコード)を取得するRepositoryのメソッドについて纏めました。(特に、検索の自由度が高い「findBy」の用法がメインです。)

Repositoryについては以下記事で纏めています。

なお、デバッグモードを設定しておくと、エラーが起きたときに詳細情報が表示されるようになります。
エラー箇所を探しやすくなるので、開発前に設定しておくのをオススメします。
デバッグモードの設定方法については こちらの記事 で解説しています。

【動作環境】
EC CUBEのバージョン:4.1.2
サーバー:Xserver

目次

find()

引数に数値をセットすると、その数値と同じIDのレコードを取得します。

// 「商品ID = 2」の商品レコードを取り出して$productに代入
$product = $this->productRepository->find(2);

findOneBy()

引数には、検索条件を連想配列にまとめたもの(フィールド名 => 値)がセットされます。

// 「商品ID = 2」の商品レコードを取り出して$productに代入
$product = $this->productRepository->findOneBy(['id' => 2]);

// 「商品名 = 'チェリーアイスサンド'」の商品レコードを取り出して$productに代入
$product = $this->productRepository->findOneBy(['name' => 'チェリーアイスサンド']);

条件に合致するレコードが複数あった場合は、テーブルの一番上にあるレコードのみを取得します。

findAll()

全レコードを配列として取得します。

// 全商品レコードを取得し、$productsに配列として代入
$products = $this->productRepository->findAll();

findBy()

Repositoryに用意されたメソッドの中で、いろいろな条件を設定できる検索メソッドです。
上述の3つのメソッドもfindBy()で代用できるため、個人的にはfindBy()のみ覚えておけばOKかと。取得したレコードは配列で格納されます。

条件を指定してレコードを取得する

// 「商品ID = 2」の商品レコードを取り出して$products(配列)に代入
$products = $this->productRepository->findBy(['id' => 2]);

// 「商品名 = 'チェリーアイスサンド'」の商品レコードを取り出して$products(配列)に代入
$products = $this->productRepository->findBy('name' => 'チェリーアイスサンド');

一見するとfindOneBy()と同じですが、findOneBy()はレコードを1つしか取得できないのに対し、findBy()は条件に合うレコードをすべて配列として取得します。

複数条件検索(AND / OR)

[フィールド名1 => 値1, フィールド名2 => 値2, …]と記述することで、すべての条件に合うレコードのみを取得します。

// AND検索
// 「商品名 = サンプル」かつ「id = 3」の商品レコードを取得
$products = $this->productRepository->findBy(['name' => 'サンプル', 'id' => '3']);

[フィールド名 => [値1, 値2, …]]と記述することで、いずれかの値に合致するレコードすべてを取得します。

// OR検索
// 「id = 2」または「id = 5」の商品レコードを取得
$products = $this->productRepository->findBy(['id' => [2, 5]]);

全レコードを取得する

第一引数に空の配列([])を指定すると、そのテーブルに格納されている全レコードを配列で取得できます。
findAll()と同じですね。

// 全商品レコードを取得し、$productsに配列として代入
$products = $this->productRepository->findBy([]);

並び順(ソート)を指定する

第二引数に並び順を指定できます。
並び順はASC(昇順(小さい順))かDESC(降順(大きい順))のどちらかです。

// 昇順(全商品をidの小さい順に取得)
$products = $this->productRepository->findBy([], ['id' => 'ASC']);

// 降順(全商品をidの大きい順に取得)
$products = $this->productRepository->findBy([], ['id' => 'DESC']);

取得数を指定する

第三引数にレコードの取得数を指定できます。

// 全商品レコードのうち、先に取得できた3つのみを配列$productsに代入します。
$products = $this->productRepository->findBy([], [], 3);

取得開始位置を指定する

第四引数にレコードの取得開始位置を指定できます。

// 全商品レコードのうち、2番目〜4番めに取得したレコード(計3つ)を配列$productsに代入します。
$products = $this->productRepository->findBy([], [], 3, 2);

まとめ

以上、Repositoryの基本機能である検索メソッドについて纏めました。

特にfindBy()は引数に様々な条件を指定できるので、よく使われるメソッドです。
もちろん商品以外のテーブルにも使えるので、ぜひ使ってみてください!

なお、検索条件をさらに細かく設定したい場合は、以下記事もご覧ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ノベルティグッズのECサイトを運営する中小企業役員。
本ブログを通じ、販促向けの最新/ロングセラー商品紹介やWebサイト制作に役立つ技術情報を発信しています。

目次