🌓

LaravelのクエリビルダとEloquentって何?

2022/12/03に公開

LaravelのクエリビルダとEloquentって何者?

案件先の方から、DBからデータを取得したいけど冗長からEloquent使わないとダメって言われました。。。と嘆かれ、なぜEloquentを使用した方が良いか理解していなかったため、説明用で作成しました!

クエリビルダとは?

クエリビルダとは、DBからデータを取得する操作の1つです。SQLの知見が必要であるため、SQL構文を理解している方は馴染みやすいかと思います。

Eloquentとは?

クエリビルダ同様に、DBからデータを取得する操作の1つです。ただ、クエリビルダと違いSQL構文の理解がなくてもDB操作が可能です(多少は必要ですがね)。
LaravelのORMであり、二次元の表であるDBのレコードと、PHPのオブジェクトを対応させて、扱いやすくしています。

使用方法

大きな違いとしては、記述方法です。なので、それぞれの記述方法について見ていきます。

※実行するSQLとしては、『Usersテーブルから全権取得する』とします。

クエリビルダ

  • DBファサードをUSE宣言
    以下のようにDBファサードをuseしてあげる必要があります。
use Illuminate\Support\Facades\DB;

- データを取得するテーブルのモデルをUSE宣言
DBファサード同様にモデルをuseしてあげる必要があります。

use App\Models\User;
  • クエリビルダ実行
$users = DB::table('users')->get();

Eloquent

  • モデルをUSE宣言
use App\Models\User;
  • Eloquent実行
 $users = User::all();

このように、Eloquentの方がシンプルに記述することができます。
他のSQLの場合も見てみましょう。

※実行するSQLとしては、『Usersテーブルと紐づいているOrdersテーブルから特定の条件に当てはるデータ取得する』とします。

クエリビルダ

  • クエリビルダ実行
$users = DB::table('users')
                   ->join('orders', 'users.id', '=', 'orders.user_id')
	   ->where('name', 'John')
	   ->get();

Eloquent

  • Usersモデルにリレーションを定義
class User {
  public function orders() {
    return $this->hasMany('App\Order');
  }
}
  • Eloquent実行
$user = User::first(1)->orders;

ここまで見ると、別にどっちでも良くない?と感じるからもいるかと思います。
しかし、まだ説明していない決定的な差があるのです・・・・

クエリビルダはSQLインジェクションが起こる可能性がある

クエリビルダの記載内容によっては、脆弱性対策がなされていないため、データの流出などに繋がる可能性があります。
そのため、Eloquentを使用した方がセキュアなコーディングとなるわけです。

特別な事情がなければ、Eloquentを使用するようにしましょう!!!!

おわり。

Discussion