「find」や「findBy」など、データベースから任意のデータ(レコード)を取得するRepositoryのメソッドについて纏めました。(特に、検索の自由度が高い「findBy」の用法がメインです。)
Repositoryについては以下記事で纏めています。
デバッグモードを設定しておくと、エラーが起きたときに詳細情報が表示されるようになります。
エラー箇所を探しやすくなるので、開発前に設定しておくのをオススメします。
デバッグモードの設定方法については 以下記事 で解説しています。
カスタマイズ後は、デバッグモードの解除を忘れないように。
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()は引数に様々な条件を指定できるので、よく使われるメソッドです。
もちろん商品以外のテーブルにも使えるので、ぜひ使ってみてください!
なお、検索条件をさらに細かく設定したい場合は、以下記事もご覧ください。