

プロ太先生、こんにちは!最近LaravelとRailsを両方勉強してるんですが、データベースからデータを取得する書き方が似てるようで違っていて混乱してます…

確かに両方ともWebフレームワークだから似てる部分もあるけど、書き方には特徴があるんだ。今日は具体例を使って比較してみよう!
1.基本的なデータ取得
全データを取得する場合

まずは一番基本的な「全部のデータを取る」方法から教えてください!

OK!では、例として「users」テーブルから全ユーザーを取得してみよう。
Laravel(PHP)の場合
// Eloquent ORMを使用
$users = User::all();
// または Query Builder を使用
$users = DB::table('users')->get();
Rails(Ruby)の場合
# Active Recordを使用
users = User.all

おぉ!!Railsの方がすごくシンプルですね!

Railsは「設定より規約」という思想で、シンプルに書けるように設計されているからね。LaravelはPHPの文法に従うから、少し記号が多くなるんだ。
特定の条件でデータを取得する場合

次は条件を指定してデータを取得してみよう。「年齢が20歳以上のユーザー」を探す場合はこうなるよ。
Laravel
// Eloquent ORM
$users = User::where('age', '>=', 20)->get();
// Query Builder
$users = DB::table('users')
->where('age', '>=', 20)
->get();
Rails
# Active Record
users = User.where('age >= ?', 20)
# または
users = User.where(age: 20..) # Ruby 2.7以降の書き方

なるほど!どちらも where
を使うんですね。
でもちょっと書き方が違う…

Laravelは3つの引数(カラム名、演算子、値)を分けて書くのが基本。Railsは条件を文字列やハッシュで書くことが多いんだ。
2.よく使うクエリパターン
並び替え(ORDER BY)

データを並び替えたい時はどう書くんですか?

OK!では、「作成日時が新しい順」で並べてみよう。
Laravel
// 新しい順(降順)
$users = User::orderBy('created_at', 'desc')->get();
// 古い順(昇順)
$users = User::orderBy('created_at', 'asc')->get();
// または 'asc' は省略可能
$users = User::orderBy('created_at')->get();
Rails
# Active Record
users = User.where('age >= ?', 20)
# または
users = User.where(age: 20..) # Ruby 2.7以降の書き方
ちなみに、descが降順、ascが昇順の覚え方は、
ascは「a」から始まって「c」で終わるので「a、b、c…」ということで昇順。 descは「d」から始まって「c」で終わるので「d、c、b、a…」ということで降順。 と覚えると覚えやすいぞ!
件数制限(LIMIT)

では、今度は「最新の注文を1件だけ取得」する場合を見てみよう!
Laravel
// 最新の注文を1件取得
$latest_order = DB::table('orders')
->select('customer_id') // customer_idカラムのみ選択
->orderBy('created_at', 'desc') // 作成日時の新しい順に並び替え
->limit(1) // 1件だけ取得
->first(); // 結果を1つのオブジェクトとして取得
Rails
# 最新の注文を1件取得
latest_order = Order.select(:customer_id) # customer_idカラムのみ選択
.order(created_at: :desc) # 作成日時の新しい順に並び替え
.limit(1) # 1件だけ取得
.first # 結果を1つのオブジェクトとして取得

なるほど!両方とも似たような流れで書けるんですね!

「メソッドチェーン」という方法で、処理を順番につなげて書けるから読みやすいよね。
3.複数条件の組み合わせ
AND条件

複数の条件を組み合わせたい時はどうするんですか?

じゃあ、例えば「年齢が20歳以上かつ性別が男性のユーザー」を探してみよう。
Laravel
$users = User::where('age', '>=', 20)
->where('gender', 'male') // AND条件は where を続けて書く
->get();
Rails
users = User.where('age >= ? AND gender = ?', 20, 'male')
# または
users = User.where(age: 20.., gender: 'male')
OR条件

では、次は、OR条件(「または」の条件)も見てみよう。「東京または大阪に住んでいるユーザー」の場合だね。
Laravel
$users = User::where('city', 'Tokyo')
->orWhere('city', 'Osaka') // OR条件は orWhere を使う
->get();
Rails
users = User.where('city = ? OR city = ?', 'Tokyo', 'Osaka')
# または
users = User.where(city: ['Tokyo', 'Osaka']) # 配列を使うとIN句になる
4.集計系の操作
COUNT(件数を数える)

データの件数だけ知りたい時はどうするんですか?

countメソッドを使うんだ!「20歳以上のユーザー数」を数えてみよう。
Laravel
$count = User::where('age', '>=', 20)->count();
echo "20歳以上のユーザーは{$count}人です";
Rails
count = User.where('age >= ?', 20).count
puts "20歳以上のユーザーは#{count}人です"
その他の集計

他にも色々な集計ができるよ。
Laravel
// 合計(SUM)
$total_age = User::sum('age');
// 平均(AVG)
$average_age = User::avg('age');
// 最大値(MAX)
$max_age = User::max('age');
// 最小値(MIN)
$min_age = User::min('age');
Rails
# 合計(SUM)
total_age = User.sum(:age)
# 平均(AVG)
average_age = User.average(:age)
# 最大値(MAX)
max_age = User.maximum(:age)
# 最小値(MIN)
min_age = User.minimum(:age)
5.JOIN(テーブル結合)

複数のテーブルを組み合わせて使いたい時はどうするんですか?

JOINという機能を使うんだ!例えば「ユーザーとその注文履歴」を一緒に取得してみよう。
Laravel
// INNER JOIN
$users_with_orders = User::join('orders', 'users.id', '=', 'orders.user_id')
->select('users.name', 'orders.total_amount')
->get();
// LEFT JOIN
$all_users = User::leftJoin('orders', 'users.id', '=', 'orders.user_id')
->select('users.name', 'orders.total_amount')
->get();
Rails
# INNER JOIN
users_with_orders = User.joins(:orders)
.select('users.name, orders.total_amount')
# LEFT JOIN
all_users = User.left_joins(:orders)
.select('users.name, orders.total_amount')

Railsの方はシンボル(:orders)を使うんですね!

そう!Railsはモデル間の関連(association)を事前に定義しておけば、シンプルに書けるんだ。Laravelも同様の機能があるけど、今回は基本的なクエリビルダーの書き方を紹介したよ。
6.グループ化(GROUP BY)

最後にグループ化を見てみよう。「各都市のユーザー数」を調べる場合だね。
Laravel
$city_counts = User::select('city', DB::raw('COUNT(*) as user_count'))
->groupBy('city')
->get();
Rails
city_counts = User.select(:city, 'COUNT(*) as user_count')
.group(:city)
まとめ

ありがとうございました!だいぶ整理できました。

最後に重要な共通点のポイントをまとめておこう。
共通点
- どちらもメソッドチェーンでクエリを構築
- 基本的なCRUD操作は似たような書き方
- ORMを使ってデータベース操作を簡単に

これで両方使い分けられそうです!ありがとうございました!!