この記事ではLaravelのデータ取得時に使う「find()」「first()」「get()」「all()」の違いについてまとめています。
自分がLaravelをやり始めた頃はこの違いが全く理解できず、エラーが出まくっていました。
この4つの違いを理解しておくと、データ取得時に悩むことが減ると思うのでこの機会にぜひ参考にしてみてください。
この記事を読むメリット
- データ取得の「find()」「first()」「get()」「all()」の違いが理解できる
- データ取得時に適切なメソッドが使えるようになる
4つのデータ取得のざっくりとした違い
まずは4つのデータ取得のざっくりとした違いを紹介しようと思います。
専門用語を使うと、データ取得時の返り値がModelオブジェクトかCollectionクラスの違いが大きいのですが、私は最初の頃この意味が全く理解できませんでした。(笑)
簡単にいうと、「データを1つだけ取ってくる」か、「複数取ってくる」かの違いです。
厳密には違うのかもしれませんが私はこの理解がとてもしっくりきました。
よく出てしまうエラー
よく自分が出していたエラーで以下のようなものがありました。
Method メソッド名 does not exist.
例えばUserモデルでdelete()というメソッドを用意していたのに上記のエラーが出てしまうことがあります。
これは先ほど挙げた、取得したデータの返り値の種類が重要になってきます。
取得したデータがModelオブジェクトの場合、そのメソッドを使用できます。
しかし、取得したデータがCollectionクラス場合は上記のようなエラーが出ます。
CollectionクラスはModelオブジェクトを複数格納する配列のようなクラスです。
つまり、Modelオブジェクトが複数入ったCollectionクラスにモデルオブジェクトのメソッドを使用しようとしていることで起きているエラーだったのです。
これを理解できると4つのデータ取得の違いが理解しやすくなる
この違いを理解できれば4つのデータ取得の違いを理解しやすくなります。
大きな違いは返り値がどちらかという違いなのでこれまでのことをなんとなく理解しておくと良いかと思います。
エンジニアにおすすめ書籍
エンジニアになりたて、これから勉強を深めていきたいという方におすすめの書籍はこちら!
Laravelのデータ取得:find()
それではここからはそれぞれのデータ取得の特徴を解説していきます。
まずはfind()です。
find()は引数にidを指定することで、該当するidのレコードを返します。
$post = Post::find(4);
return $post;
// idが4のPostオブジェクト
返り値はModelオブジェクトになります。
よってレコード1件だけが返ってきます。
Laravelのデータ取得:first()
続いてはfirst()でのデータ取得です。
first()は該当レコードの最初のレコードのみを取得するものです。
$post = Post::whereDate('created_at', Carbon::today())->first();
return $post;
// created_atが今日のPostオブジェクトの1件目
このコードではwhereDate句を使って「created_at」の値が今日のデータだけを抽出し、そこから最初の1件だけを取得します。
先ほどのfind()と同じく、1件のみが返ってくるのでModelオブジェクトが返り値となります。
「最初の1件」の基準
先ほど「最初の1件」を取得すると述べましたが、その「最初」の基準はデフォルトではidになります。
複数のデータを取得した際、返ってくるデータはidが基準となってidが小さい順に並んだ状態になります。
その基準をidから他のものに変更することも可能です。
「orderBy」メソッドで並び順を変更することでそれが実現します。
$post = Post::whereDate('created_at', Carbon::today())->orderBy('created_at', 'desc')->first();
return $post;
// 1番最近作成されたPostオブジェクト1件
「created_at」を基準に降順に並び替えた上で最初の1件を取得します。
つまり、今日の最新のデータを取得していることになります。
基準を変更する場合は「orderBy」を使用しましょう。
日付を扱う「Carbon」
余談ですが、「今日」を「Carbon::today()」を使って表現しています。
CarbonはPHPが用意している日付を扱うライブラリです。
Laravelにも標準で導入されており日付操作などにとても便利です。
詳しい使い方はこちらの記事を参考にしてみてください。
PHPの日付ライブラリ「Carbon」基本的な使い方【取得、計算、判定、比較】
Laravelのデータ取得:get()
続いてはget()になります。
$posts = Post::whereDate('created_at', Carbon::today())->get();
return $post;
// 今日作成されたPostオブジェクトすべて 返り値はCollectionクラス
上記のコードは「created_at」が「今日」のものをすべて取得しています。
返り値は今までの2つの取得方法とは異なり「Collection」クラスです。
get()の返り値にModelオブジェクトのメソッドは使えない
そのため「$post」に対してPostオブジェクトのメソッドなどは使えません。
foreachを使用してレコード1件ずつを取り出すとメソッドを利用できます。
$posts = Post::whereDate('created_at', Carbon::today())->get();
foreach ($post as $post) {
$post->delete();
}
get()で取得した場合は注意しましょう。
当てはまるデータが1件のみでも返り値はCollectionクラス
もし「Post::whereDate(‘created_at’, Carbon::today())->get()」に当てはまるデータが1件だとしても、返り値は必ずCollectionクラスです。
1件だとしてもメソッドなどを利用する場合はforeachが必要です。
また、1件だけの場合はfind(),first()を使いましょう。
Laravelのデータ取得:all()
最後はall()です。
all()も返り値はCollectionクラスです。
$posts = Post::all();
return $post;
// Postデータすべて 返り値はCollectionクラス
モデルの全レコードを取得する場合に利用します。
フィルタリングやソートは使用できない
all()メソッドはモデルの全レコードを取得するものです。
そのためwhere句やorderByなどのメソッドを使用することはできません。
使用する場合はall()ではなく、get()を使用しましょう。
そのほかのメソッドの返り値も理解しておくと便利
今回はデータ取得形メソッドの4つを解説しましたが、その他のよく使うメソッドも存在します。
save()やupdate()、delete()、create()などがよく使われます。
それらについても返り値を理解しておくと便利なケースがあります。
以下記事で詳しく解説してありますのでよければ参考にしてみてください。
用途に合わせて4つのデータ取得を使い分けよう
いかがだったでしょうか。
4つのデータ取得の違いが理解していただければ幸いです。
どの取得方法も使うことがありますので、用途に合わせて使い分ける必要があります。
完璧に理解する必要はないと思うのでざっくり違いを理解しておきましょう。