0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravelのクエリビルダとモデルの違い

Last updated at Posted at 2024-06-21

はじめに

Laravelには、データベース操作を簡単にするためのツールとして、クエリビルダとEloquent ORM(モデル)が用意されています。
これらのツールはそれぞれ異なる目的と特性を持ち、適切に使い分けることで効率的なデータベース操作が可能になります。
Laravelのクエリビルダとモデルの違いについて解説します。

クエリビルダとは

クエリビルダは、データベースクエリをSQL文として直接書かずに、メソッドチェーンを使用してクエリ実行することができます。
複雑なクエリもSQL文をそのまま書くより簡潔に記述でき、データベース操作に対して細かい制御も可能です。

use Illuminate\Support\Facades\DB;

// 単純なSELECTクエリ
$users = DB::table('users')->get();

// 条件付きSELECTクエリ
$activeUsers = DB::table('users')->where('active', 1)->get();

// 複雑なJOINクエリ
$usersWithPosts = DB::table('users')
    ->join('posts', 'users.id', '=', 'posts.user_id')
    ->select('users.*', 'posts.title')
    ->get();

Eloquent ORM(モデル)

モデルオブジェクトとデータベーステーブルを対応させることで、データベース操作をオブジェクト指向的に扱えるようにします。
コードが直感的で読みやすくでき、モデル間のリレーションシップ(1対多、多対多など)などを簡単に定義し操作できます。
多くの便利なメソッドが用意されています。

use App\Models\User;

// 全てのユーザーを取得
$users = User::all();

// 条件付きクエリ
$activeUsers = User::where('active', 1)->get();

// リレーションシップを使ったクエリ
$user = User::find(1);
$posts = $user->posts; //

クエリビルダとEloquentの違い

構文と使用感

クエリビルダ:

メソッドチェーンを使ってクエリを構築します。
SQLに近い構文で、細かい制御が可能です。
SQLに精通している開発者には直感的ですが、モデルの概念がないため、オブジェクト指向的な操作には向いていません。

モデル:

オブジェクト指向的にデータベース操作を行います。
リレーションシップやスコープを使った柔軟なクエリが容易に書けます。

リレーションシップ

クエリビルダ:

JOINを使用してテーブル間のリレーションを操作します。
明示的にJOIN条件を記述する必要があります。

モデル:

モデル間のリレーションシップを定義し、簡単にリレーションを操作できます。
$user->postsのような直感的な構文でリレーションを扱えます。

まとめ

Laravelのクエリビルダとモデルは、それぞれ異なる目的と特性を持っています。
クエリビルダは、直接的なSQL操作と柔軟性を提供し、モデルはオブジェクト指向的なデータベース操作とリレーションシップ管理を簡素化します。
プロジェクトの要件に応じて、これらのツールを適切に使い分けることで、効率的かつ効果的なデータベース操作を実現できます。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?