SQLを分かりやすく扱おう! ~クエリビルダとEloquent~

株式会社WOWN エンジニアチームです。

前回、SQLのお話をしました。
SQLとは、データベースに対して「こういう条件でデータを探してきてください」とお願いするクエリ(検索キーワード)を与える言語です。

SQLは使いにくい

SELECT users.name, users,email, COUNT(orders.id) AS order_count
FROM users
LEFT JOIN orders ON users.id = orders.user_id
WHERE users.age > 18
GROUP BY users.id
HAVING COUNT(orders.id) > 0
ORDER BY order_count DESC;

前回の例でも使用しましたが、「18歳以上で、なにか注文をしているユーザーを探してきて。見つけたら注文が多い順に並べて表示して」というデータベース内の検索をSQLで書くとこういうコードになります。

正直言うとこれは読みにくいです。
文字ばかりがズラッと並び、どこからどこまでがデータベースを操作していて、どこからが保存したデータのテーブル(領域)やカラム(項目)の名前なのか、かなり注意して読む必要があります。

また、Laravel (PHP)のプログラム中にここだけ別の(SQL)言語で書く必要があります。
Webシステムの制作にSQLクエリの作成は避けて通れない操作ですが、これはあまり親切な実装ではありません。

このため、Laravelでは「クエリビルダ」と「Eloquent ORM」という2つの機能がクエリを作成するために備わっています。

 

クエリビルダ

DB::table('users')
 ->leftJoin('orders', 'users.id', '=', 'orders.user_id')
 ->select('users.name', 'users.email', DB::raw('COUNT(orders.id) as order_count'))
 ->where('users.age', '>', 18)
 ->groupBy('users.id')
 ->havingRaw('COUNT(orders.id) > 0')
 ->orderBy('order_count', 'desc')
 ->get();

クエリビルダとは、SQLの内容をPHPらしく記述できるようにした機能です。

使われている構文やコードの構造などはSQLとほとんど同じで、SQLの作法やセオリーをそのまま使うことができます。

クエリビルダになったことでコード中の各操作がカッコで囲われたり矢印(メソッドチェーン)がついたりして、どれが操作の名前でどれが記録の名前なのか?などが視覚的に分かりやすくなりました。

 

Eloquent ORM

User::withCount(['orders' => function($query) {
    $query->having('count', '>', 0);
  }])
  ->where('age', '>', 18)
  ->having('orders_count', '>', 0)
  ->orderBy('orders_count', 'desc')
  ->get(['name', 'email', 'orders_count']);

クエリビルダをもう一段階発展させた機能です。

SQLやクエリビルダでは、データベースの記録をusers.id(userテーブルのidカラム)やorders.user_id(ordersテーブルのuser_idカラム)などといった書き方で参照していましたが、Eloquentではモデルクラスというものをひとつの単位にして、この単位ごとに参照や操作を行います。
これがORM (Object-Relational Mapping)と呼ばれる機能です。

EloquentはSQLやクエリビルダとは違ったコードの書き方になるため、SQLの作法やセオリーに詳しくない人でも扱うことが可能です。
SQLやクエリビルダの内容と比較してコードが短くまとまっています。より読みやすいと言えるでしょう。

 

用途

MacBook Pro showing programming language

クエリビルダもEloquentも、内部ではLaravelが代わりにSQLクエリを作成しています
返ってくるデータの形式で若干の違いがある場合もありますが、基本的にどれを使っても同一の内容を取得することができます。

株式会社WOWNのエンジニアチームでは用途に応じてクエリビルダとEloquentを使い分けています。
単純なクエリならクエリビルダを使い、特殊なリレーション(複数の種類にまたがった記録の参照)を行う際にはEloquentを利用するパターンが多いです。

また、Laravelプロジェクト内ではなく外部のデータベース管理ソフト内でデバッグを行うこともあります。
この場合はLaravelの機能であるクエリビルダやEloquentは使えないので、SQL文を書いて記録の参照や検証を行うこともあります。

SQLもクエリビルダもEloquentも、どれも使うシチュエーションがあるということですね。

 

 

さて、Eloquentの説明で、「モデルクラス」という単語を使いました。
今回は簡単にモデルクラスのことを「単位」と呼びましたが、実はこの「モデル」と「クラス」の概念はそれぞれLaravelにおいて非常に重要なファクターです。

次回、モデルとクラスを知るための「オブジェクト指向」の話へ続きます。

WEB制作・ITに関するお悩みや
ご質問等お気軽にご相談ください

contact

この記事の著者

コメントする

関連記事