LaravelとRailsのクエリ書き方比較 – データベース操作をマスターしよう!

プロ太先生、こんにちは!最近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を使ってデータベース操作を簡単に

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