「find」や「findBy」など、データベースから任意のデータ(レコード)を取得するRepository(リポジトリ)のメソッドについて纏めました。(特に、検索の自由度が高い「findBy」の用法がメインです。)
デバッグモードを設定しておくと、エラーが起きたときに詳細情報が表示されるようになります。
エラー箇所を探しやすくなるので、開発前に設定しておくのをオススメします。
デバッグモードの設定方法については 以下記事 で解説しています。
カスタマイズ後は、デバッグモードの解除を忘れないように。
find()
引数にIDを指定すると、そのIDに一致するレコードを取得します。IDが存在しない場合はnull
が返されます。
// 「商品ID = 2」の商品レコードを取り出して$productに代入
$product = $this->productRepository->find(2);
findOneBy()
条件を指定して、最初に見つかった1件のレコードを取得します。引数には、検索条件を連想配列にまとめたもの(フィールド名 => 値)がセットされ、複数条件を指定することもできます。条件に一致するエンティティが存在しない場合はnull
が返されます。
// 「商品ID = 2」の商品レコードを取り出して$productに代入
$product = $this->productRepository->findOneBy(['id' => 2]);
// 「商品名 = 'チェリーアイスサンド'」の商品レコードを取り出して$productに代入
$product = $this->productRepository->findOneBy(['name' => 'チェリーアイスサンド']);
// 「商品ID = 2」かつ「商品名 = 'チェリーアイスサンド'」の商品を取り出す
$product = $this->productRepository->findOneBy(['id' => 2, 'name' => 'チェリーアイスサンド']);
findAll()
全レコードを配列として取得します。
// 全商品レコードを取得し、$productsに配列として代入
$products = $this->productRepository->findAll();
findAll()
メソッドは引数を取らず、空です。- 条件に一致するレコードが1件もない場合は空の配列(
[]
)を返します。null
は返されません。 - すべてのレコードを取得するため、大量のデータがある場合にはメモリやパフォーマンスに影響が出る可能性があります。
findBy()
条件に一致する複数のレコードを配列として取得できるメソッドです。引数には、検索条件を連想配列にまとめたもの(フィールド名 => 値)がセットされ、複数条件を指定することもできます。1件も条件に該当しなかった場合は空の配列()
が返されます。
前述の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検索)
// AND検索
// 「商品名 = サンプル」かつ「id = 3」の商品レコードを取得
$products = $this->productRepository->findBy(['name' => 'サンプル', 'id' => '3']);
[フィールド名 => [値1, 値2, …]]と条件に対して配列を指定すると、いずれかの値に合致するレコードすべてを取得します。(OR検索)
// OR検索
// 「id = 2」または「id = 5」の商品レコードを取得
$products = $this->productRepository->findBy(['id' => [2, 5]]);
全レコードを取得する
第一引数に空の配列([]
)を指定すると、そのテーブルに格納されている全レコードを配列で取得できます。(findAll()
と同じ)
// 全商品レコードを取得し、$productsに配列として代入
$products = $this->productRepository->findBy([]);
findBy([])
とfindAll()
は同じ結果を返しますが、findAll()
の方が意図が明確(全レコード取得)になり、コードを見ただけで目的がわかりやすいというメリットがあります。
並び順(ソート)を指定する
第二引数に並び順(ASC または DESC)を指定できます。
- 昇順(ASC)
-
小さい順、例えば数値が小さい順、アルファベットがAからZに並ぶ順。
// 昇順(全商品をidの小さい順に取得) $products = $this->productRepository->findBy([], ['id' => 'ASC']);
- 降順(DESC)
-
大きい順、例えば数値が大きい順、アルファベットがZからAに並ぶ順。
// 降順(全商品をidの大きい順に取得) $products = $this->productRepository->findBy([], ['id' => 'DESC']);
複数のフィールドで並び順を指定することもできます。例えば、name
で昇順、id
で降順に並び替えることもできます。
// 「nameを昇順」「idを降順」で並び替え
$products = $this->productRepository->findBy([], ['name' => 'ASC', 'id' => 'DESC']);
取得数を指定する
第三引数に取得するレコード数を指定することで、結果の件数を制限することができます。
// 全商品レコードのうち、先に取得できた3つのみを配列$productsに代入します。
$products = $this->productRepository->findBy([], [], 3);
取得開始位置を指定する
第四引数に取得を開始する位置(オフセット)を指定することで、指定した位置からレコードを取得できます。これを利用することで、例えばページネーションを実装したり、特定の範囲のデータを取得することができます。
// 全商品レコードのうち、2番目〜4番めに取得したレコード(計3つ)を配列$productsに代入します。
$products = $this->productRepository->findBy([], [], 3, 2);
まとめ
以上、Repositoryの基本機能である検索メソッドについて纏めました。
特にfindBy()
は引数に様々な条件を指定できるので、よく使われるメソッドです。
もちろん商品以外のテーブルにも使えるので、ぜひ使ってみてください!
なお、検索条件をさらに細かく設定したい場合は、以下記事もご覧ください。

