本記事は、Laravelの基本的なデータ取得メソッドのfind・first・get・allの違いについてしっかり確認・理解できる内容となっています。
この記事を書く背景
学習者へアドバイスやサポートする立場のお仕事に携わっているなかで、 このような質問がありました。
以前、->(アロー演算子)でデータを取得できたはずなのに、エラーになります。
なんでですか?
原因は
get()メソッドで呼び出したデータを->(アロー演算子)を使っていたので、データを取得出来ていませんでした。
以前にデータを取得していたときは、first()メソッドを使用していたからです。
ではなぜget()ではだめなのか
どういう用途のときにget()を使うのか
データを出力していきながら、そのあたりもしっかりと確認していきたいと思います。
確認のための準備
説明の為にサンプル用として、usersテーブルにデータを格納して準備しました。
<urersテーブル>
id | name | |
---|---|---|
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)でもお知らせしています。
ご興味のある方は、ぜひこちらから
フォローをお願いいたします!