79
60

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 3 years have passed since last update.

【 Laravel 】クエリビルダ と Eloquent ORM の違いを整理!

Last updated at Posted at 2021-05-24

#はじめに

Laravel でデータベースを操作するには、

・DBクラス
・DBクラスのクエリビルダ
・Modelクラスの Eloquent ORM

上記3つのうち、どれかを使用しますが、

学習中、クエリビルダ と Eloquent ORM の違いがよく分からないままに
使用してしまっていたので自分なりに整理しました!

表でざっくり比較

    クエリビルダ          Eloquent ORM     
__Modelが必要 __ ×
__リレーション定義 __ ×
__タイムスタンプ更新 __ ×
__クエリビルダが使用可能 __
__SQLインジェクション対策 __ ○※ ○※
記述量 多め 少なめ

※ クエリビルダ も Eloquent ORM も、SQL文を書くことができる Raw メソッドを使用する
場合は、コードを記述する者がSQLインジェクション対策を考慮したクエリを書く必要があるため注意が必要です。

###Eloquent でもクエリビルダが使用できる。

Tip!! Eloquentモデルはクエリビルダですから、クエリビルダで使用できる全メソッドを確認しておくべきでしょう。
Eloquentクエリでどんなメソッドも使用できます。
readouble.com Laravel 6.x Eloquent:利用の開始

私の場合、これを失念したまま使用していたため、見た目が同じでなにが違うのか分からくなっていました。

###どちらもSQLインジェクション対策がされている。

LaravelクエリビルダはアプリケーションをSQLインジェクション攻撃から守るために、
PDOパラメーターによるバインディングを使用します。バインドする文字列をクリーンにしてから渡す必要はありません。
readouble.com Laravel 6.x Laravel 6.x データベース:クエリビルダ

SQLインジェクションとは、悪意のあるユーザーが不正なクエリ( データベースへの命令文 )
を書き、データベースへアクセスしてデータの漏洩・改ざんを行う攻撃のこと。

クエリビルダ を使用すれば、バインディングにより不正なクエリを、

命令文ではなく "文字列" として扱ってくれるため、

安全なデータベースとのやり取りが可能になります。

参考: SQLインジェクション対策について - 独立行政法人 情報処理推進機構(IPA)

所属するクラス

###・ クエリビルダ

Illuminate\Support\Facades\DB

###・ Eloquent ORM

Illuminate\Database\Eloquent\Model

#クエリビルダとは
 
・SQL文をPHPのメソッドを使う感覚で、簡単に組み立てられるようにしたもの。
・SQL文を生成するためのメソッドを、メソッドチェーンで記述して、データベースを
  操作することができます。

記述は以下のようなイメージ

$article = DB::table('articles')
              ->join('users', 'articles.user_id', '=', 'users.id')
              ->select('articles.id as article_id', 'title', 'body', 'user_id','users.id', 'users.name')
              ->orderBy('articles.created_at', 'desc')
              ->get();

###メリット

・PHPらしい記述方法ながらも、SQLライクに書けるから、どんなクエリが
 発行されているのかわかりやすい。
 
・そのため SQL 構文の知識がある人は使いやすい。
 
・join句を使ってクエリを書けば Eloquent でサブクエリを使うより速い。
 
・バインディング変数使用で、SQLインジェクション対策がされている。
 ( Eloquent と 同様 )

###デメリット

・リレーションを正しく把握して、自分でテーブル結合をしなくてはならない。
 
・そのため SQL文の理解が必要。
 
・上記2点を正しく考慮できていないと、意図しないデータの取得や、データベースの
  操作につながる恐れがある。
  
・記述量が多くなりがち。

#Eloquent ORM とは
####Eloquent は Laravel で提供されている データベース操作のための機能で ORM の一種 です。

ORM とは

__Object-Relational Mapping の略__で、アプリケーションのModelと、データベースのテーブルを
マッピングする機能のことをいいます。( O/Rマッパーという呼ばれ方もしている )

マッピングとは

オブジェクトとリレーショナルデータベースのレコードを対応付けることをいいます。
テーブルをクラス、レコードをインスタンスとし、オブジェクトとして直感的に扱えるようにします。
 
 
データベースから " 取得したレコードは PHPのオブジェクトに変換 "
 
データベースに  " 渡す値はオブジェクトから レコードに変換 "
###メリット
・アプリケーション( Laravel )の中に別言語であるSQLを混在させずに済む。
・テーブル同士の関係性を定義できる。
 
・データベースのテーブルとレコードをPHPのクラスとインスタンスのように直感的に
  扱うことができる。
 
・バインド変数を利用して 安全な SQL を作ってくれる。→ SQL インジェクション対策
 
・クエリビルダ のすべてのメソッドを使うことができる。

 
__ SQL を書かないことにより、アプリケーションとデータベースが疎結合になり、
 データベースが何であろうと、アプリケーション側の実装に影響が出ない。__
 ( データベースごとの方言を吸収してくれる。 )
 
 

###デメリット
・初学者の場合、SQLが書けなくてもデータ取得ができるため、SQLの扱いに慣れない。
 
・見た目にどのようなクエリが発行されているか分からない。
 
・複雑な条件でデータを取得しようとすると記述が大変。
 
・メモリの消費が大きい。

#どっちがいいの?

現役エンジニアさんに聞いてみたところ、
 
「 どちらも一長一短があることと、現場によっても左右されるため、どちらがいいということはない 」

という感じのお話。

調べてみれば、おっしゃるようにそれぞれのメリット・デメリットがわかりましたので、
 
どちらにも対応 + 生SQL の記述もできるように、学習を続けていこうと思った
クエリビルダ と Eloquent についての調べでした。

以上です。

ここまでご覧いただきまして感謝いたします。ありがとうございます!

79
60
5

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
79
60

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?