LaravelでDBからデータを取得する際、返ってくる型は「Eloquentモデルを使うか、クエリビルダを使うか」で決まります。
Eloquentモデル → Modelクラスインスタンス
Eloquentモデル(User::find()など)を使うと、Modelクラスのインスタンスが返ってきます。
// Modelインスタンスが返る(App\Models\User)
$user = User::find(1); // → App\Models\Userオブジェクト
$users = User::get(); // → Illuminate\Database\Eloquent\Collection(中身はUserオブジェクト)
echo get_class($user); // "App\Models\User"
$user->posts; // リレーションが使える!
$user->save(); // モデルのメソッドが使える!
複数取得時もコレクションの中にModelオブジェクトが入っています。
foreach (User::get() as $user) {
echo get_class($user); // 毎回 "App\Models\User"
}
クエリビルダ → stdClassオブジェクト
クエリビルダ(DB::table())を使うと、stdClassオブジェクトが返ってきます。
// stdClassが返る
$user = DB::table('users')->where('id', 1)->first(); // → stdClassオブジェクト
$users = DB::table('users')->get(); // → Illuminate\Support\Collection(中身はstdClass)
echo get_class($user); // "stdClass"
$user->posts; // エラー!リレーション使えない
$user->save(); // エラー!モデルのメソッド使えない
複数取得時もコレクションの中にstdClassが入っています。
foreach (DB::table('users')->get() as $user) {
echo get_class($user); // 毎回 "stdClass"
}
実装パターンの違いと使い分け
| 実装方法 | 1件取得 | 複数取得 | リレーション使える? | モデルのメソッド使える? |
|---|---|---|---|---|
Eloquent User::find()
|
Userモデル |
Collection[Userモデル] |
✅ | ✅ |
クエリビルダ DB::table()
|
stdClass |
Collection[stdClass] |
❌ | ❌ |