13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-06-01

はじめに

本記事は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;

13
11
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
13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?