PHPerがRubyistになろうとしてつまづいたところ③SQL

こんにちは!WEBアプリケーションエンジニアの小松です!

この記事は[Enigmo Advent Calendar 2024]の17日目の記事です。  

Railsの場合: 自動的に日付オブジェクトとして認識

RailsActiveRecordのORMを利用する場合だけでなく、rawクエリを用いた場合でもdate型はRubyDateオブジェクトに変換されます。そのため、日付フォーマットの変換を簡単に記述できます。

サンプルコード(Rails

テーブル定義

# migration
create_table :events do |t|
  t.date :event_date
  t.timestamps
end

rawクエリの利用

result = ActiveRecord::Base.connection.execute("SELECT event_date FROM events LIMIT 1")
raw_date = result.first["event_date"] # => #<Date: 2023-12-13>

puts raw_date.strftime('%Y%m%d') # => "20231213"

ポイント

  • event_dateRubyDateオブジェクトとして取得される。
  • .strftimeメソッドを直接利用してフォーマットを変更可能。

Laravelの場合: 明示的な型変換が必要

Laravelでrawクエリを使用した場合、デフォルトではdate型は文字列として取得されます。そのため、フォーマットを変更する際は、明示的にCarbonオブジェクトなどに変換する必要があります。

サンプルコード(Laravel)

テーブル定義

// migration
Schema::create('events', function (Blueprint $table) {
    $table->date('event_date');
    $table->timestamps();
});

rawクエリの利用

use Illuminate\Support\Facades\DB;
use Carbon\Carbon;

$result = DB::select("SELECT event_date FROM events LIMIT 1");
$rawDate = $result[0]->event_date; // => "2023-12-13" (文字列)

$carbonDate = Carbon::parse($rawDate);
echo $carbonDate->format('Ymd'); // => "20231213"

ポイント

  • event_dateは文字列として取得される。
  • PHPCarbonライブラリを利用して明示的に日付オブジェクトに変換する必要がある。

RailsとLaravelの比較表

特徴 Rails Laravel
rawクエリでのdate型の扱い 自動的にDateオブジェクトとして認識される 文字列として取得される
日付フォーマットの変更 .strftime('%Y%m%d')が直接利用可能 Carbon::parse($date)->format('Ymd')が必要
追加の変換処理の必要性 不要 必要
デフォルトの開発者体験 日付操作が非常に簡潔で直感的 明示的な型変換が必要で、柔軟性が高い
適用範囲 ActiveRecordでもrawクエリでも同じ Eloquentとrawクエリで挙動が異なる

開発者の観点からの結論

Railsのメリット

  • 開発効率が高い: 日付型は自動的にDateオブジェクトとして認識され、変換処理を意識する必要がありません。
  • 統一性がある: ActiveRecordでもrawクエリでも同じように扱えます。
  • 時間をかけてハマる前に、まず .to_sqlでクエリを確認 する習慣をつけると、デバッグがスムーズになります!

Laravelのメリット

  • 柔軟性が高い: Carbonを使えば、細かい日付操作やタイムゾーン操作が可能です。
  • 設計の自由度: 明示的な変換により、モデルやユースケースに応じた日付処理を柔軟に適用できます。

Railsは「標準的な処理が簡潔」、Laravelは「柔軟性を重視」といったフレームワークの哲学の違いが、日付型の扱い方にも表れています。どちらを選ぶかはプロジェクトの要件やチームの好みに依存しますが、簡潔さを求める場合はRailsが有利です。