LoginSignup
7
2

More than 3 years have passed since last update.

【Laravel】結局どう違うの?Eloquent, DBクラス, クエリビルダ 前編

Last updated at Posted at 2020-12-31

困りごと

PHP歴3ヶ月、Laravel歴1ヶ月の初学者です。LaravelのDBの操作方法はEloquent ORM・DBクラス・クエリビルダに分類されます。表示されればなんでもOKというからレベルを一段階上げていきたい初学者がこれらの違いについてまとめました。

前編:各記述法の違いについて。(今回)
後編:どのように記述法を選択していくのか(次回)

開発環境

PHP 7.2.34 / Laravel 6.20.5

記述法を比較

①DBファザードはIlluminate\Support\Facades\DBクラスによる記述法。
②Eloquent ORMはIlluminate\Database\Eloquent\Modelクラスを継承する記述法。
それぞれ見ていきます。

①DBクラスの記述 (DBファザード)

DBクラスによる記述のためIlluminate\Support\Facades\DBをuseする。

Controller.php
 use Illuminate\Support\Facades\DB;

⭐️ DBファザード パターン①

DB::SQL値(SQL文、パラメータ配列)のように引数に直接SQL文を用いて記述する。
SQL値にはinsertやupdateなどの基本的なSQLのメソッドは揃っている。

記述例

controller.php
 public function query(Request $request) {
  //SELECT文
  $items = DB::select('select * form users where id = ?',[1]);  
  //INSERT文
  DB::insert('insert into users (id, name) values (?,?)',[1,'たかし']);
  //UPDATE文
  DB::update('update users set age = 100 where id = ?, [2]');
  //DELETE文
  DB::delete('delete from users');
 }

Laravel公式リファレンス(DBファザード)
https://readouble.com/laravel/5.dev/ja/database.html

⭐️ DBファザード パターン②

SQL文を生成するためのメソッドをメソッドチェーンで記述することによりデータベースを操作する。
DB::table('テーブル名')->メソッド()のように記述する。

記述例
・usersテーブルから、フィールド名(id)とパラメータ(requestされたid)が同じレコードを取得

Controller.php
 public function select(Request $request) {
   $items = DB::table('users')->where('id',$request->id)->first();
   return view('index',['items' => $items]);
 }
  //DB::table('テーブル名')->where('フィールド名',パラメータ)->first() 

・usersテーブルの内容をリクエストされた値へ変更(フィールド名とパラメータが同じレコードに対しての処理)

Controller.php
 public function update(request $request) {
   $param = [
     'id' => $request->id,
     'name' => $request->name,
     'comment' => $request->commment,
   ];
   DB::table('users')->where('id',$request->id)->update($param);
 }
 //DB::table('テーブル名')->where('フィール名',パラメータ)->update(パラメータ);

Laravel公式リファレンス(クエリビルダ)
https://readouble.com/laravel/5.dev/ja/queries.html

また、クエリの中で直接SQLを使用したい場合はDB::rawメソッドを使用する。

Countroller.php
$users = DB::table('users')
                  ->select(DB::raw('count(*) as count, status'))
                  ->where('status','<>',1)
                  ->groupBy('status')
                  ->get();

参考:https://readouble.com/laravel/5.7/ja/queries.html

余談ですが、

DBファサードでの insert もしくは update では created_at や updated_at は更新されません。
Eloquent を利用したときのみです。

とのことです。私はこれが原因で値が保存されずにハマったことがあります。
参考:https://laraweb.net/knowledge/2347/

②Modelクラスの記述 (Eloquent ORM)

※Eloquent ORMの基本の考え方 例:usersテーブル

①1つのクラスがDBの1テーブルに対応 $users = User::all()
②クラスの1インスタンス(オブジェクト)は、DBの1レコードに対応 $user = new User()
③クラスの属性は、テーブルの各カラムに対応 {{$user->comment}}
EloquetORM.png

⭐️ Eloquent ORM

モデルクラスによる記述のためApp\Model名をuseする。

Controller.php
use App\Models\User;    //Modelsディレクトリの配下にUserモデルを生成。

記述例
・usersテーブルの全ての値を、Collection型として取得してview(index)へ渡す

Controller.php
public function select(Request $request)
{
 $item = User::all();  
 return view('index',['items' => $items]); 
}

・usersテーブル内でリクエストされたnameフィールドと同じ値のレコードを、Collection型として取得しview(index)へ渡す。

Controller.php
public function search($Request $request) 
{
 $item = User::where($request->name)->get();  //クラス名::where(検索する値')->取得方法
 return view('index',['items' => $items]);
}

参考:
https://blog.ytake.jp.net/entry/2015/12/16/011812
https://qiita.com/gone0021/items/f1e8223c94dbaab22fca

最後に

書き方の違いについてざっくりまとめました。書き方が多くあるが故に、僕のような初学者は選択に困ってしまう部分だと思います。理解がより深まるようにメリデメについてまとめたかったのですが、長くなってきたので後編に書きます。
この内容は奥が深いようなので、実務経験を元にさらにブラッシュアップしていきます。
(本内容に誤りがありましたらご指摘いただけると幸いです。)

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2