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

## 困りごと
PHP歴３ヶ月、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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/e70bfd77-4dbd-929b-8fdf-429488e81399.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

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