はじめに
本記事はLaravel初学者が初めてEloquentについて学んだので、備忘録として書いています。
Eloquentとクエリビルダとは
Eloquent
LaravelのORM(Object-Relational Mapping)であり、データベースとのやり取りを行う際に使用されます。Eloquentを使うことで、SQLクエリを直接書かずにオブジェクト指向の記述でデータベースを操作できます。戻り値はモデルオブジェクト
クエリビルダ
クエリビルダ(Query Builder)は、Laravelのデータベースクエリを構築するための機能です。クエリビルダを使用すると、直接SQLクエリを書く代わりに、オブジェクト指向のメソッドチェーンを使用してデータベースクエリを構築できます。戻り値はコレクション
使うメリットは?
-
データベース操作の抽象化とコードが簡潔になる
Eloquentとクエリビルダは、データベース操作を抽象化するため、開発者がSQLクエリを直接記述する必要がなくなります。これにより、より簡潔で読みやすいコードを書くことができます。 -
SQLインジェクションからのセキュリティ保護
Eloquentとクエリビルダは、SQLインジェクション攻撃からアプリケーションを保護するためにPDOパラメーターバインディング(SQL文のクエリ文字列内に直接変数や値を埋め込む代わりに、プレースホルダーを使用してクエリを作成し、その後にパラメータをバインドする)を使用します。
これにより、入力値がクリーンアップやサニタイズされ、SQL文として解釈される際に悪意のあるコードとして実行されるリスクが軽減されます。参考:SQLインジェクション
-
柔軟性と保守性
データベース操作に便利な機能を提供します。例えば、モデル間のリレーションシップの管理やクエリのチェーンメソッドの使用などがあります。
どんな違いがあるの?
-
記述方法
Eloquentはオブジェクト指向のアプローチであり、モデルと呼ばれるクラスを使用してデータベーステーブルを表現します。モデルはテーブルと1対1の関係を持ち、そのメソッドを使用してデータベース操作を行います。一方、クエリビルダはメソッドチェーンを使用してクエリを構築します。 -
自動的なモデルマッピング
Eloquentはモデルとデータベーステーブルの間で自動的なマッピングを提供します。モデルのプロパティにアクセスすることでデータベースカラムの値を取得したり、逆にモデルのプロパティに値を設定することでデータベースを更新したりできます。クエリビルダでは明示的にカラム名を指定する必要があります。 -
リレーションシップのサポート
Eloquentはリレーションシップ(テーブル間の関連付け)をサポートしており、モデル間の関連を簡単に操作できます。例えば、ユーザーモデルとポストモデルがある場合、Eloquentを使用して関連付けられたポストを簡単に取得できます。クエリビルダではリレーションシップを扱うために追加のクエリを書く必要があります。
どう使い分ければいいの?
-
シンプルなクエリの場合
基本的なデータベース操作やシンプルなクエリを行う場合は、クエリビルダを使用すると便利です。メソッドチェーンを使ってクエリを構築し、柔軟に条件や結果を操作できます。 -
モデルとリレーションシップを利用したい場合
データベーステーブルの関連を扱いたい場合や、複雑なクエリを使用しなければならない場合は、Eloquentを使用します。Eloquentはリレーションシップをサポートしており、モデル間の関連付けを簡単に操作する事ができます。
クエリビルダで利用できる機能
- テーブルの選択: tableメソッドを使用して操作したいテーブルを指定します。
$query = DB::table('users');
- 条件の追加: whereメソッドを使用してクエリに条件を追加します。
$query = DB::table('users')
->where('age', '>', 18);
- フィールドの選択: selectメソッドを使用して取得するフィールドを指定します。
$query = DB::table('users')
->select('name', 'email');
- データの取得: getメソッドを使用してクエリを実行し、結果を取得します。
$users = DB::table('users')->get();
- レコードの挿入: insertメソッドを使用してデータをテーブルに挿入します。
DB::table('users')->insert([
'name' => 'Hoge',
'email' => 'hoge@example.com',
]);
- レコードの更新: 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;
- 条件に一致するデータの取得(WHERE句を含むSELECTクエリ)
$user = User::where('id', 1)->first();
Userモデルからidが1と一致するユーザーデータを取得しています。これに対応するSQLクエリは以下の通りです。
SELECT * FROM users WHERE id = 1 LIMIT 1;
- 複数の条件に一致するデータの取得(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);
- データの挿入(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');
- データの更新(UPDATEクエリ)
$user = User::find(1);
$user->name = 'Hoge';
$user->save();
idが1に該当するユーザーデータのnameを更新しています。これに対応するSQLクエリは以下の通りです。
UPDATE users SET name = 'Hoge' WHERE id = 1;
- データの削除(DELETEクエリ)
$user = User::find(1);
$user->delete();
idが1に該当するユーザーデータを削除しています。これに対応するSQLクエリは以下の通りです。
DELETE FROM users WHERE id = 1;