1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Laravel 開発入門】Eloquentの「first」と「get」の違いを徹底解説

Posted at

Laravel Eloquentの「first」と「get」の違いを徹底解説

LaravelのEloquent ORMは、データベース操作を直感的かつ効率的に行うための強力なツールです。特に初心者の方にとって、first()get()メソッドの違いは混乱しがちなポイントの一つです。この記事では、それぞれのメソッドの違い、使い方、適切な使用シーンについて詳しく解説します。

first()get()の基本的な違い

first()メソッド

  • 返り値: 単一のモデルインスタンス(見つからない場合はnull
  • 目的: クエリ条件に一致する最初のレコードだけを取得したい場合に使用
  • SQLイメージ: SELECT * FROM テーブル名 WHERE 条件 LIMIT 1

get()メソッド

  • 返り値: モデルインスタンスのコレクション(空のコレクションも含む)
  • 目的: クエリ条件に一致する全てのレコードを取得したい場合に使用
  • SQLイメージ: SELECT * FROM テーブル名 WHERE 条件

データ型の違い

first()の戻り値

  • データ型: Eloquentモデルインスタンス(またはnull
  • : App\Models\Userのインスタンス
  • アクセス方法: オブジェクト構文でプロパティに直接アクセス(例: $user->name
  • 値がない場合: nullが返される

get()の戻り値

  • データ型: Illuminate\Database\Eloquent\Collectionクラスのインスタンス
  • 中身: Eloquentモデルインスタンスのコレクション
  • 空の場合: 空のコレクションオブジェクト(nullではない)

コレクションとは?

Laravelのコレクションは単なる配列ではなく、データを扱うための多くの便利なメソッドを持つラッパークラスです。通常の配列との主な違いは以下のとおりです:

  1. メソッドチェーンが可能
  2. 豊富なヘルパーメソッド
  3. データ変換が簡単
  4. 柔軟なデータアクセス方法

実用例

first()の例

// IDが1のユーザーを取得
$user = User::where('id', 1)->first();

// メールアドレスでユーザーを検索
$user = User::where('email', 'test@example.com')->first();

// 条件に一致するユーザーがいない場合はnullが返る
if ($user === null) {
    // ユーザーが見つからなかった場合の処理
}

get()の例

// アクティブな全ユーザーを取得
$activeUsers = User::where('active', true)->get();

// 特定の年齢以上のユーザーを取得
$adultUsers = User::where('age', '>=', 18)->get();

// 結果をループで処理
foreach ($activeUsers as $user) {
    echo $user->name;
}

// 結果が空でも空のコレクションが返る
if ($activeUsers->isEmpty()) {
    // ユーザーが見つからなかった場合の処理
}

first()のデータアクセス例

$user = User::where('email', 'test@example.com')->first();

// nullチェックが必要
if ($user !== null) {
    echo $user->name;  // オブジェクトのプロパティとしてアクセス
    $user->update(['last_login' => now()]); // モデルメソッドを直接使用可能
}

get()のデータアクセス例

$users = User::where('active', true)->get();

// コレクションのメソッドが使える
$names = $users->pluck('name');  // 名前だけの配列を取得
$totalAge = $users->sum('age');  // 年齢の合計を計算

// foreachでループ処理
foreach ($users as $user) {
    echo $user->name;
}

// 空かどうかのチェック
if ($users->isEmpty()) {
    echo 'ユーザーがいません';
}

どのような場面で使うべきか

first()が適している場面

  • 一意の識別子(ID、メールアドレスなど)で特定のレコードを検索する場合
  • 条件に一致する最初のレコード「だけ」が必要な場合
  • 単一のモデルインスタンスとして扱いたい場合
  • 「見つからなかった」という状態(null)を明示的に扱いたい場合

get()が適している場面

  • 条件に一致する全てのレコードが必要な場合
  • 結果をループで処理したい場合
  • コレクションメソッド(mapfiltereachなど)を使用したい場合
  • 結果が0件の場合でも一貫してコレクションとして扱いたい場合

パフォーマンスの観点

first()LIMIT 1を使用するため、大量のデータがある場合でも1レコードのみを取得して処理を終了します。一方、get()は条件に一致する全てのレコードを取得するため、大量のデータがある場合はメモリ使用量が増加します。

初心者向けのアドバイス

  1. 単一のレコードを扱う場合:

    • first()を使う
    • 戻り値は直接モデルのプロパティにアクセスできる
    • nullチェックをお忘れなく
  2. 複数のレコードを扱う場合:

    • get()を使う
    • 戻り値はコレクションなので、豊富なメソッドが使える
    • ループ処理や配列操作が簡単

まとめ

  • 単一のレコードが欲しい → first()
  • 複数のレコードが欲しい → get()
  • パフォーマンスを考えると、単一レコードを取得する場合は常にfirst()を使うことをお勧めします。

この違いを理解することで、適切なシチュエーションで適切なメソッドを選択できるようになります。Laravel Eloquentの強力な機能を活用して、より効率的なコードを書きましょう。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?