Developersをフォローする

LaravelのクエリビルダとEloquentの違いとは?

バックエンド

先輩方のコードをパクりながらLaravelを書き始めて半年くらい経ちましたが、
DB操作するときのクエリビルダとEloquent何が違うの?という疑問がずっとあったのでまとめてみました。

//クエリビルダ 
DB::table('orders')->where('cancelFag','0')>get(); 
//Eloquant
Order::where('cancelFag','0')>get(); 

↑同じでは…?

何が違うの?

クエリビルダはPHPの書き方でSQLクエリを作成し、実行することができます。
戻り値はDBの取得値をコレクションにしたものです。

EloquentはlaravelのORM(オブジェクト関係マッピング)です。
二次元の表であるDBのレコードと、PHPのオブジェクトを対応させて、扱いやすくしています。

そのため、Eloquentの戻り値はEloquentモデルオブジェクトです。
複数レコードの場合は、オブジェクト型のコレクションで返ってきます。

そしてEloquentではクエリビルダの書き方は全て使えます。

クエリビルダ…戻り値がコレクション
Eloquent…戻り値がモデルオブジェクト

クエリビルダとEloquentの書き方の違い

主キーで検索するとき

//クエリビルダ
$user = DB::table('users')->where('id',1)->get();
// コレクションクラスなのでis_emptyで判定
if(is_empty($user)){
   XXXX
}
//Eloquent
$user = User::find(1);
if(is_empty($user)){
   XXXX
} 

Eloquentモデルがあると、勝手にテーブルの主キーがidというカラムだとみなしてくれるため
Eloquentのほうが圧倒的にシンプルですね。
もちろんモデルで主キーをid以外に指定することもできます。

find()の戻り値

//クエリビルダ
$user = DB::table('user')->find(1);

//クエリビルダ
$user = User::find(1);

こんなふうにクエリビルダをEloquentでも使えます。

Eloquentの何がうれしい?

  1. 戻り値がオブジェクトなのでDBから取得したデータを加工しやすい
  2. 複雑なDB操作が可能なメソッドが用意されている

この辺が利点かなと思います。
特に2.は、softdelete()や、save()が便利だな~と思いました

また、私はもともとJavaから入ったので、ちまちまDBに対応するモデルを作ってgetterとsetterを定義して~のようにやっていたのですが、
laravelだと、テーブル名と同じ名前のクラスを作るだけで勝手にモデルになるのが楽でいいなあと思いました。

最初は何が起きてるのかよくわからなかったのですがこれからEloquent活用していきたいです!