エンジニ屋.com(エンジニヤドットコム)

分かりやすくを意識して情報発信!

【Laravel】データ取得 find・first・get・all の違いをしっかり理解 【比較】


本記事は、Laravelの基本的なデータ取得メソッドのfind・first・get・allの違いについてしっかり確認・理解できる内容となっています。

この記事を書く背景

学習者へアドバイスやサポートする立場のお仕事に携わっているなかで、 このような質問がありました。


以前、->(アロー演算子)でデータを取得できたはずなのに、エラーになります。
なんでですか?

原因は
get()メソッドで呼び出したデータを->(アロー演算子)を使っていたので、データを取得出来ていませんでした。
以前にデータを取得していたときは、first()メソッドを使用していたからです。

ではなぜget()ではだめなのか
どういう用途のときにget()を使うのか

データを出力していきながら、そのあたりもしっかりと確認していきたいと思います。

確認のための準備

説明の為にサンプル用として、usersテーブルにデータを格納して準備しました。

<urersテーブル>

id name email
1 test test@example.com
2 morisi morisi@m.com
3 morisi hogehoge@m.com
4 enginiya enginiya@e.com

またControllerで下記のようにuseでUser.phpを宣言しています。

<?php

namespace App\Http\Controllers;

use app/Models/User.php;

class TestController extends Controller
{
    public function index(){

        ここに処理を書いていくとします。

    }
}

準備は整ったので、indexメソッド内に記述して確かめていこうと思います。

first

では最初にfirst()のみで試します。

$user = User::first();
dd($user);

※dd関数とは「dump and die」の略でdump出力した後、そこで処理が終了します。

dumd出力結果

左上を見ると、App/Models/Userとなっており、データはUserのモデルオブジェクトを参照しています。

プロパティのattributesにはカラムが関連付いています。

出力されたデータはというと、usersテーブルの1番上のレコードのデータが取得されています。

ただ1番上のレコードのみ取得するという場面はあまり無いと思うので、where()で指定したレコードを取得して確認していきます。

$user = User::where('name', 'morisi')->first();
dd($user);

dump出力結果

nameがmorisi という2つのレコードの内、1つ目のデータを取得しました。

データを表示させたい場合は、->(アロー演算子)カラム名でデータベースの値が取得できます。

$user = User::where('name', 'morisi')->first();
dd($user->email);

dump結果

morisi@m.com

Modelのオブジェクトなので、->(アロー演算子)で該当のemailが取得できました。

基本的な用途としては、 特定のカラムに特定の値が入ったレコードの存在有無の確認であったり、

特定のカラムの値を出力したい場合があげられます。

find

次にfindを確認します。

findの引数にidを指定します。 引数がないとエラーになります。

$user = User::find(4);
dd($user);

dump出力結果

findは指定のidのレコードデータ出力します。

firstと同じように左上をみてもらうとわかるとおりデータはUserのモデルオブジェクトを参照しています。

Attributeにはカラムが関連付いているので、

ー>カラム名でデータベースの値が取得できます。

$user = User::find(4);
dd($user->email);

dump出力結果

enginiya@e.com

基本的には用途としては、 idを基準にレコードの編集や削除が挙げられます。

■ここで削除処理の例を1つあげます。

public function delete($id)
{
User::find($id)->delete(); }

findでidを指定してdelete()で該当のレコードが削除できます。

因みにwhere()で絞り込みしたあとに、該当のidが存在しないようであればnullが返却されます。こういった記述はしませんが一応例として書いておきます。

$user = User::where('name', 'morisi' )->find(4);
dd($user->email);

dump結果

null

all

それではall()を確認します。

$users = User::all();
dd($users);

左上がCollectionになっています。

$user->nameで値を取得しようとするとエラーになります。

collectionクラスは配列items内にModelオブジェクトが入っているので、foreachでオブジェクトを取り出してから->でカラム名を指定する、もしくはkey番号を指定して取得する必要があります。

foeach ($users as $user){
      $name = $user->name ;
      dump($name);
}

dump結果

test
morisi 
morisi
enginiya

1つ1つの名前を取り出して表示させることができます。

key番号の指定方法はこちらです。

$name = $users[0]->name;
dump($name);

dump結果

test

Modelオブジェクトをkeyで呼び出して、該当レコードのnameを呼び出せます。

但し、基本的に直接keyを指定する方法は、取り出したいModelの間違いが発生しやすいので避けるべき方法です。

allの基本的な用途としては、 テーブル内の全ての情報を一覧として表示させてたいときなどがあげられます。

補足

laravelにはコレクションメソッドが用意されているので、コレクションメソッドを使用して、全てのデータを加工して出力も行えます。

1つの例としてmapメソッドを使ってみます。

$names = User::all()->map(function ($user) {
    return $user->name . 'さん';
});

dd($names);

全てのレコードのnameデータが加工された状態で配列として取得できました。 このように全てのモデルを加工して呼び出すことも簡単に行えます。

get

最後にget()を確認します。

$user = User::get();
dd($user);

allと同じように取得されます。 全ての情報を取得する場合はall()でもget()でも同じことがわかりました。

nameが特定の値の情報のみ欲しい場合は、 whereなどで指定する場合があるので、その場合はget()で取得する必要があります。

$user = User::where('name', 'morisi')->get();
dd($user);

この場合、get()の代わりにall()で取得しようとするとエラーになります。

dump出力結果

該当する2つのレコードが出力されました。

allと同じようにitemsの配列の中に各Modelがあるので、基本的にはforeach で取得することとなります。

get()の基本的な用途としては、 検索機能で該当レコードを出力をするときがあげられます。

以上となります。お疲れ様でした。

あいまいな覚えでも特に困ることなく開発は出来ますが、しっかりと理解して抑えておくことがとても大事な部分だなと思いました。

最新の記事を公開する際には、X(旧Twitter)でもお知らせしています。
ご興味のある方は、ぜひフォローをお願いいたします!