株式会社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やクエリビルダの内容と比較してコードが短くまとまっています。より読みやすいと言えるでしょう。
用途
クエリビルダもEloquentも、内部ではLaravelが代わりにSQLクエリを作成しています。
返ってくるデータの形式で若干の違いがある場合もありますが、基本的にどれを使っても同一の内容を取得することができます。
株式会社WOWNのエンジニアチームでは用途に応じてクエリビルダとEloquentを使い分けています。
単純なクエリならクエリビルダを使い、特殊なリレーション(複数の種類にまたがった記録の参照)を行う際にはEloquentを利用するパターンが多いです。
また、Laravelプロジェクト内ではなく外部のデータベース管理ソフト内でデバッグを行うこともあります。
この場合はLaravelの機能であるクエリビルダやEloquentは使えないので、SQL文を書いて記録の参照や検証を行うこともあります。
SQLもクエリビルダもEloquentも、どれも使うシチュエーションがあるということですね。
さて、Eloquentの説明で、「モデルクラス」という単語を使いました。
今回は簡単にモデルクラスのことを「単位」と呼びましたが、実はこの「モデル」と「クラス」の概念はそれぞれLaravelにおいて非常に重要なファクターです。
次回、モデルとクラスを知るための「オブジェクト指向」の話へ続きます。
WEB制作・ITに関するお悩みや
ご質問等お気軽にご相談ください