はじめに
みなさんこんにちは!
TOMON_9912です!
Laravelを使っているとクエリビルダを使ってこのようにデータ取得しませんか?
->get();
->first();
ですが、このようなデータ取得をする時にデータ取得結果が0件だった場合という条件分岐を書くことがあると思います。その時、書き方に困ったので備忘録的に記録しておきたいと思います。
first()
の場合
どのようなデータを扱っているのか?
first()
メソッドは、クエリの結果セットから最初の1件のレコードを取得する際に使用します。結果が0件の場合、nullを返します。
取得したデータは以下のような構造になっています。
stdClass Object
├─ id: 1
├─ name: "山田 太郎"
└─ email: "taro@example.com"
0件取得時の書き方
first()
で取得した結果がnull
かどうかで判定します。
$user = DB::table('users')->where('id', 1)->first();
if ($user === null) {
// ユーザーが見つからなかった場合の処理
echo "ユーザーが見つかりませんでした。";
} else {
// ユーザーが見つかった場合の処理
echo "ユーザー名: " . $user->name;
}
get()
の場合
どのようなデータを扱っているのか?
get()
メソッドは、クエリの結果セットからすべてのレコードを取得する際に使用します。結果が0件の場合、空のIlluminate\Support\Collection
インスタンスを返します。
インスタンスには、以下のような構造でデータが入っています。
Collection (Illuminate\Support\Collection)
│
├─ 0: stdClass Object
│ ├─ id: 1
│ ├─ name: "山田 太郎"
│ └─ email: "taro@example.com"
│
├─ 1: stdClass Object
│ ├─ id: 2
│ ├─ name: "佐藤 花子"
│ └─ email: "hanako@example.com"
│
└─ 2: stdClass Object
├─ id: 3
├─ name: "鈴木 次郎"
└─ email: "jiro@example.com"
0件取得時の書き方
get()で取得した結果が空のコレクションかどうかは、isEmpty()メソッドやcount()メソッドで判定できます。
isEmpty()
メソッドを使う方法
$users = DB::table('users')->where('status', 1)->get();
if ($users->isEmpty()) {
// ユーザーが見つからなかった場合の処理
echo "該当するユーザーはいませんでした。";
} else {
// ユーザーが見つかった場合の処理
foreach ($users as $user) {
echo "ユーザー名: " . $user->name . "\n";
}
}
count()
メソッドを使う方法
$products = DB::table('products')->where('stock', 0)->get();
if ($products->count() === 0) {
// 商品が見つからなかった場合の処理
echo "在庫切れの商品はありません。";
} else {
// 商品が見つかった場合の処理
echo "在庫切れの商品が" . $products->count() . "件あります。\n";
foreach ($products as $product) {
echo "商品名: " . $product->name . "\n";
}
}
まとめ
Laravelのクエリビルダでデータ取得時に結果が0件だった場合の条件分岐は、取得メソッドによって扱いが異なります。
-
first()の場合: 結果が0件だとnullを返すため、=== nullで判定します
-
get()の場合: 結果が0件だと空のコレクションを返すため、isEmpty()メソッドやcount() === 0で判定します
これらの違いを理解しておくと、より堅牢なコードを書くことができますね。