symfonyを触り始めた人へのDoctrine(ORM)入門2

こんにちは。木戸です。

前回の記事symfonyを触り始めた人へのDoctrine(ORM)入門を書いてから、半年以上経っていることに驚きを隠せません。

前の記事で「データを自分の欲しい形にカスタマイズして取得する方法」を書くと宣言していたので、今回はデータの取得について書いてきます。

超便利なfindBy()

前回、プライマリーキー以外でデータを取得する際はfindBy()を使うと書きました。そしてこのfindBy()がめっちゃ便利なので紹介します。

findBy()で出来ること

  1. データの取得
  2. ソート
  3. データ件数の制限
  4. 開始位置の指定

初めて知った時「え、findBy()でここまで出来るん!?」と驚きました。これを知らなかった時に長いコードを書いた覚えがあります…

この記事を見てくれている皆さんが、僕みたいに長いコードを書かなくて済むようにfindBy()の使い方を説明していきます。

※findBy()のソースが気になる方は、Doctrine\ORM\EntityRepositoryのfindBy()を見てください。

peopleに登録されているデータ(主キーはid)

id:1,  lastName:佐藤, firstName:太一,  age:31
id:2,  lastName:佐藤, firstName:太郎,  age:41
id:3,  lastName:佐藤, firstName:俊一郎, age:21
id:4,  lastName:佐藤, firstName:翔,   age:21
id:5,  lastName:鈴木, firstName:一郎,  age:51
id:6,  lastName:鈴木, firstName:次郎,  age:46
id:7,  lastName:鈴木, firstName:三郎,  age:41
id:8,  lastName:高橋, firstName:大輝,  age:21
id:9,  lastName:高橋, firstName:海斗,  age:22
id:10, lastName:高橋, firstName:拓海,  age:23

データの取得

前回の記事と被りますがカラムの値を指定してデータを取得する方法です。

$name= '佐藤'; 
$peopleList = $em->getRepository(people::class)->findBy([ 'lastName' => $name ]);
取得結果
id:1, lastName:佐藤, firstName:太一,  age:31
id:2, lastName:佐藤, firstName:太郎,  age:41
id:3, lastName:佐藤, firstName:俊一郎, age:21
id:4, lastName:佐藤, firstName:翔,   age:21

ソートしてデータを取得

ソートする際は第二引数にソートする対象のカラムと並び順を追加します。

苗字が佐藤さんのデータを年齢の高い順に取得します。

$name= '佐藤'; 
$peopleList = $em->getRepository(people::class)->findBy(
   ['lastName' => $name],
   ['age' => 'DESC' ]
);
取得結果
id:2, lastName:佐藤, firstName:太郎,  age:41
id:1, lastName:佐藤, firstName:太一,  age:31
id:3, lastName:佐藤, firstName:俊一郎, age:21
id:4, lastName:佐藤, firstName:翔,   age:21

第二引数のソート条件を加えると、1つ目のキーと条件でデータが等しかった場合、2つ目のキーと条件でソートされます。

苗字が佐藤さんのデータを年齢の高い順、年齢が同じ場合、idの降順にソートし取得します。

$name= '佐藤'; 
$peopleList = $em->getRepository(people::class)->findBy(
   ['lastName' => $name],
   ['age' => 'DESC',
       'id' => 'DESC']
);
取得結果
id:2, lastName:佐藤, firstName:太郎,  age:41
id:1, lastName:佐藤, firstName:太一,  age:31
id:4, lastName:佐藤, firstName:翔,   age:21
id:3, lastName:佐藤, firstName:俊一郎, age:21

データ件数の制限

データ件数を制限して取得する際は第三引数に欲しいデータの件数を渡します。

※今回はデータ絞り込み、並び替えを行わないので、第一、第二引数に空の配列を渡します。

$name= '佐藤'; 
$peopleList = $em->getRepository(people::class)->findBy(
   [],
   [],
      5
);
取得結果
id:1, lastName:佐藤, firstName:太一,  age:31
id:2, lastName:佐藤, firstName:太郎,  age:41
id:3, lastName:佐藤, firstName:俊一郎, age:21
id:4, lastName:佐藤, firstName:翔,   age:21
id:5, lastName:鈴木, firstName:一郎,  age:51

開始位置の指定

データ件数の制限を行い、次のデータが欲しい際に第四引数にどの位置からデータを取得するのかの指定を行えます。

例:「データ件数の制限」を行い次の5件が欲しい際

※第四引数に5が入っている場合、最初から5件目までのデータを飛ばして6件目のデータから取得を行います、

$name= '佐藤'; 
$peopleList = $em->getRepository(people::class)->findBy(
   [],
   [],
      5,
      5
);
取得結果
id:6, lastName:鈴木, firstName:次郎,  age:46
id:7, lastName:鈴木, firstName:三郎,  age:41
id:8, lastName:高橋, firstName:大輝,  age:21
id:9, lastName:高橋, firstName:海斗,  age:22
id:10, lastName:高橋, firstName:拓海,  age:23

簡単なデータの取得ならfindBy()で対応できそうですね

次回は、クエリビルダを使ってデータを取得する方法を書こうと思います。

どうしても知りたいという方は、こちらをご確認ください。

関連記事