[Laravel] Eloquentとクエリビルダについて

# はじめに
本記事はLaravel初学者が初めてEloquentについて学んだので、備忘録として書いています。

# Eloquentとクエリビルダとは

### Eloquent
LaravelのORM（Object-Relational Mapping）であり、データベースとのやり取りを行う際に使用されます。Eloquentを使うことで、SQLクエリを直接書かずにオブジェクト指向の記述でデータベースを操作できます。**戻り値はモデルオブジェクト**

### クエリビルダ
クエリビルダ（Query Builder）は、Laravelのデータベースクエリを構築するための機能です。クエリビルダを使用すると、直接SQLクエリを書く代わりに、オブジェクト指向のメソッドチェーンを使用してデータベースクエリを構築できます。**戻り値はコレクション**

### 使うメリットは？

* **データベース操作の抽象化とコードが簡潔になる**
Eloquentとクエリビルダは、データベース操作を抽象化するため、開発者がSQLクエリを直接記述する必要がなくなります。これにより、より簡潔で読みやすいコードを書くことができます。

* **SQLインジェクションからのセキュリティ保護**
Eloquentとクエリビルダは、SQLインジェクション攻撃からアプリケーションを保護するためにPDOパラメーターバインディング（SQL文のクエリ文字列内に直接変数や値を埋め込む代わりに、プレースホルダーを使用してクエリを作成し、その後にパラメータをバインドする）を使用します。
これにより、入力値がクリーンアップやサニタイズされ、SQL文として解釈される際に悪意のあるコードとして実行されるリスクが軽減されます。

    参考：[SQLインジェクション](https://ja.wikipedia.org/wiki/SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)

* **柔軟性と保守性**
データベース操作に便利な機能を提供します。例えば、モデル間のリレーションシップの管理やクエリのチェーンメソッドの使用などがあります。

### どんな違いがあるの？

* **記述方法**
Eloquentはオブジェクト指向のアプローチであり、モデルと呼ばれるクラスを使用してデータベーステーブルを表現します。モデルはテーブルと1対1の関係を持ち、そのメソッドを使用してデータベース操作を行います。一方、クエリビルダはメソッドチェーンを使用してクエリを構築します。

* **自動的なモデルマッピング**
Eloquentはモデルとデータベーステーブルの間で自動的なマッピングを提供します。モデルのプロパティにアクセスすることでデータベースカラムの値を取得したり、逆にモデルのプロパティに値を設定することでデータベースを更新したりできます。クエリビルダでは明示的にカラム名を指定する必要があります。

* **リレーションシップのサポート**
Eloquentはリレーションシップ（テーブル間の関連付け）をサポートしており、モデル間の関連を簡単に操作できます。例えば、ユーザーモデルとポストモデルがある場合、Eloquentを使用して関連付けられたポストを簡単に取得できます。クエリビルダではリレーションシップを扱うために追加のクエリを書く必要があります。

### どう使い分ければいいの？

* **シンプルなクエリの場合**
基本的なデータベース操作やシンプルなクエリを行う場合は、クエリビルダを使用すると便利です。メソッドチェーンを使ってクエリを構築し、柔軟に条件や結果を操作できます。

* **モデルとリレーションシップを利用したい場合**
データベーステーブルの関連を扱いたい場合や、複雑なクエリを使用しなければならない場合は、Eloquentを使用します。Eloquentはリレーションシップをサポートしており、モデル間の関連付けを簡単に操作する事ができます。

# クエリビルダで利用できる機能
* テーブルの選択: tableメソッドを使用して操作したいテーブルを指定します。
```
$query = DB::table('users');
```

<br>

* 条件の追加: whereメソッドを使用してクエリに条件を追加します。
```
$query = DB::table('users')
            ->where('age', '>', 18);
```
<br>


* フィールドの選択: selectメソッドを使用して取得するフィールドを指定します。
```
$query = DB::table('users')
            ->select('name', 'email');
```

<br>

* データの取得: getメソッドを使用してクエリを実行し、結果を取得します。
```
$users = DB::table('users')->get();
```

<br>

* レコードの挿入: insertメソッドを使用してデータをテーブルに挿入します。

```
DB::table('users')->insert([
    'name' => 'Hoge',
    'email' => 'hoge@example.com',
]);
```

<br>

* レコードの更新: updateメソッドを使用してテーブル内のレコードを更新します。
```
DB::table('users')
    ->where('id', 1)
    ->update(['email' => 'hoge@example.com']);
```
# Eloquentと対応するSQLクエリの例
Eloquentを使用してデータベースに対して行われる一般的な操作と、それに対応するSQLクエリの例を以下に示します。
* データの取得（SELECTクエリ）
```
$users = User::all();
```
Userモデルから全てのユーザーデータを取得しています。これに対応するSQLクエリは以下の通りです。
```SELECT * FROM users;```


<br>

* 条件に一致するデータの取得（WHERE句を含むSELECTクエリ）
```
$user = User::where('id', 1)->first();
```
Userモデルからidが1と一致するユーザーデータを取得しています。これに対応するSQLクエリは以下の通りです。
```SELECT * FROM users WHERE id = 1 LIMIT 1;```

<br>

* 複数の条件に一致するデータの取得（WHERE句とIN句を含むSELECTクエリ）
```
$ids = [1, 2, 3];
$users = User::whereIn('id', $ids)->get();
```
usersテーブルからidが1、2、3に一致するユーザーデータを取得しています。これに対応するSQLクエリは、以下の通りです。
```SELECT * FROM users WHERE id IN (1, 2, 3);```

<br>

* データの挿入（INSERTクエリ）
```
$user = new User;
$user->name = 'Hoge';
$user->email = 'hoge@example.com';
$user->save();
```
新しいユーザーデータを作成し、データベースに保存しています。これに対応するSQLクエリは以下の通りです。
```INSERT INTO users (name, email) VALUES ('Hoge', 'hoge@example.com');```

<br>

* データの更新（UPDATEクエリ）
```
$user = User::find(1);
$user->name = 'Hoge';
$user->save();
```
idが1に該当するユーザーデータのnameを更新しています。これに対応するSQLクエリは以下の通りです。
```UPDATE users SET name = 'Hoge' WHERE id = 1;```


<br>

* データの削除（DELETEクエリ）
```
$user = User::find(1);
$user->delete();
```
idが1に該当するユーザーデータを削除しています。これに対応するSQLクエリは以下の通りです。
```DELETE FROM users WHERE id = 1;```