クエリビルダを使って、データベースを操作し、テーブルからデータを取得したりできます。
クエリビルダは、SQL文を簡単に記述できるようにしたもの。
ですがLaravelでは、通常はEloquentを使って、データベースを操作します。
クエリビルダとEloquentは、一体何が違うのだろう?
こんなふうに感じる方のために、クエリビルダについて、Eloquentとの違いや使い方と共に解説していきますね。
クエリビルダとEloquentの比較
まずは両者の違いについて表でまとめてみます。
次のような感じです。
記述量 | 抽象度 | SQLの知識 | |
クエリビルダ | 多め | 低い
*SQL構文の理解が必要 |
必要 |
Eloquent | 少な目 | 高い
*SQLを意識しなくてOK |
なくてもOK |
クエリビルダで記述することは、通常のEloquentでも可能。
Eloquent利点
わたしの感覚だと、クエリビルダを使うよりもEloquentのほうがラクだし便利。
リレーションがあるデータの操作なども、Eloquentのほうが簡単にできます。
SQL文に詳しくなければ、あえてクエリビルダを使う必要はないでしょう。
クエリビルダの利点
逆にSQLの構文について知識がある人にとっては、クエリビルダのほうが使いやすいでしょう。
またモデルがないときは、クエリビルダのほうがコードを作りやすいと思います。
たとえば多対対でリレーションを作り、中間テーブルからデータを取るときなど。
そもそもクエリビルダとは?
そもそもクエリビルダとはなにか?
クエリビルダとは、SQL文を簡単に組み立てて、データベースの操作をしやすくしたもの。
SQL文とは、データベースの操作を行うための文です。
たとえば下記のような感じです。
【SQL文例】
1 |
$statement = $db->prepare('INSERT INTO members SET name=?, email=?, password=?, image=?, created=NOW()'); |
$変数名->prepare(‘INSERT INTO データベース名 SET 項目名1=?, 項目名2=?’)
*上記コードは下記記事内で使用しています。
結構記述がメンドウなのですが、クエリビルダは、より簡単にSQL文を書くことができます。
クエリビルダとEloquentの書き方の違い
では具体的にクエリビルダとEloquentの記述はどう違うのか。
例をご紹介します。
コードを書く前の準備について
まずはコードを書く前に、準備をしておきましょう。
必要な宣言も、クエリビルダとEloquentで異なります。
【クエリビルダ】
Laravelでクエリビルダを使用するには、最初にDBファサードをuse宣言する必要があります。
1 |
use Illuminate\Support\Facades\DB; |
次に、データを取り出すテーブルのモデル名も、use宣言に入れておきましょう。
1 |
use App\Models\User; |
【Eloquent】
一方Eloquentでは、ファサードの宣言は不要です。
ただ利用するモデル名は、クエリビルダと同様、use宣言に入れる必要があります。
1 |
use App\Models\User; |
クエリビルダとEloquentの書き方の違い例①全要素取得
それでは実際に、クエリビルダとEloquentの書き方の違いをお見せします。
たとえば、Userテーブルの全要素を取得したいとき。
クエリビルダでは次のように記述できます。
【クエリビルダ】
1 |
$users=DB::table('users')->get(); |
Eloquentでの記述例は下記の通り。
【Eloquent】
1 |
$users=User::all(); |
Eloquentのほうがシンプルですね。
クエリビルダとEloquentの書き方の違い例②リレーション入り
もうひとつ、やや込み入った例をお見せします。
たとえばUserモデルとOrderモデルでリレーションがある場合。
Userモデルで【John】という名前の【id】に該当する、Orderモデルのデータを参照したいとします。
【クエリビルダ】
クエリビルダでは、SQL言語の構文を使って表現することができます。
例えばJOINとWHEREいうSQLの構文を使って、以下のように記述できます。
1 2 3 4 |
$users = DB::table('users') ->join('orders', 'users.id', '=', 'orders.user_id') ->where('name', 'John') ->get(); |
【Eloquent】
Eloquentでは、SQLを意識せずにリレーションを表現することができます。
Userモデルファイルに下記のようにリレーションを定義しておきます。
1 2 3 4 5 |
class User { public function orders() { return $this->hasMany('App\Order'); } } |
こうしておけば、いつでも、このリレーションを利用して、Orderモデルのデータを参照できます。
参照するときには、コントローラーに次のように記述できます。
1 2 |
$user = User::where('name', 'John')->first( ); $orders = $user->orders; |
結論:好きなほうを使えばOK
最後は少しややこしい例をご紹介しましたが、わたしの主観も込めて、ひとことでいうと、
- クエリビルダはSQL文が分かる人にはわかりやすい
- そうでないときにはEloquentのほうが書きやすい
ということです。
結局のところ、好きなほうを使えば良いのかな、と^^;
個人的には、Eloquentを使ったほうがラクだし、Laravelの良さを満喫できるように感じます。
なおEloquentを使ったデータの基本的な取り出し方は下記記事にまとめているので、併せて参考にしてください。