こんにちは、Morimotoです。
Laravelでのシステム開発をしていると、データベースからデータを取得する際に、「最新の5件だけ欲しい」「表示する件数を制限したい」という状況になることがあります。
そんな時に使うのが、Laravelで提供されているデータの取得件数を制限するメソッドです。
代表的なものがtake()メソッドとlimit()メソッドの2つです。
自分も含め「名前が違うけど、何が違うの?」「どっちを使えばいいの?」と疑問に思う初心者の方も多いはず。
ということで、この記事では2つのメソッドの違いと使い方を解説していきます。
take()とlimit()、結論から言うと「ほぼ同じ」です!
いきなりですが、実はLaravelにおいて、 take()メソッドとlimit()メソッドは、機能としては「ほぼ同じ」 です。
どちらも、データベースからデータを取得する際に、取得する件数を制限(指定)するために使われます。
| メソッド名 | 役割 | 備考 |
|---|---|---|
take(整数) | 取得する件数を指定する | データを 「何件取るか (take)」 というニュアンス |
limit(整数) | 取得する件数を制限する | 取得件数に 「制限をかける (limit)」 というニュアンス |
どちらを使っても、生成されるSQL文は、通常、 LIMIT句 を含む同じものになります。
例:take(5) も limit(5) も、生成されるSQLは SELECT * FROM table_name LIMIT 5 のようになることが多いです。
なぜ2つあるの?使い分けのヒント
機能が同じなら、なぜ2つあるのでしょうか?
これには、開発者の意図や読みやすさが関係しています。
「意味」で使い分ける
Laravelは、開発者がよりコードの意味を読み取りやすいように、複数のメソッド名を提供していることがあります。
limit():SQL標準のキーワードであるLIMIT句に由来しており、 「制限」 を加えるという意味合いが強いです。- SQLに慣れている人にとっては馴染み深い表現です。
take():結果セットから 「取得する」 件数を指定するという、より直感的な表現です。- 「上から何件取る?」という日本語の感覚に近いです。
クエリビルダとEloquent
基本的にはどちらも使えますが、Laravelの公式ドキュメントや多くのコード例では、以下のような使い方が見受けられます。
🔹 クエリビルダ(DBファサードを使う場合)
どちらも使われますが、SQLのLIMITに直接対応する limit() が使われることも多いです。
// DBファサードを使ったクエリビルダの例
$users = DB::table('users')
->where('is_active', true)
->limit(10)// limit()で取得件数を制限
->get();
🔹 Eloquent(モデルを使う場合)
よりオブジェクト指向的な表現である take() が使われる傾向があります。
// Userモデル(Eloquent)を使った例
use App\Models\User;
$latestPosts = User::where('status', 'published')
->orderByDesc('created_at')
->take(5)// take()で最新の5件を取得
->get();
サンプルコードで確認してみる
実際にコードを書いてみて、挙動を確認してみます。
ここでは、postsテーブルからデータを取得する例を考えます。
📰 投稿データから最新の3件を取得する
orderByDesc('created_at')で新しい順に並び替えてから、take(3)またはlimit(3)で3件に制限します。
// 📝 postsテーブルから最新の3件を取得する
// 1. take()を使った場合
$latestPosts_take = DB::table('posts')
->orderByDesc('created_at') // 新しい順に並び替え
->take(3) // 3件だけ取得
->get();
// 2. limit()を使った場合
$latestPosts_limit = DB::table('posts')
->orderByDesc('created_at') // 新しい順に並び替え
->limit(3) // 3件に制限
->get();
// $latestPosts_take と $latestPosts_limit の中身は、通常、同じになります!
// モデル(Post::class)を使っている場合も同じです。
$latestPosts_eloquent = Post::orderByDesc('created_at')
->take(3) // または limit(3)
->get();
💡 どちらを使ってもOK!
ご覧の通り、どちらのメソッドを使っても、データの件数を制限するという目的は達成できます
なので、ご自身が「分かりやすい」「読みやすい」と感じる方を使うとOKです
skip()とoffset()も一緒に覚えよう!
take()/limit()とセットで覚えておきたいのが、 データの取得開始位置を指定する メソッドです。
skip(整数):「何件スキップするか」 を指定offset(整数):「何件目から開始するか」 を指定 (SQLのOFFSET句に対応)
これらのメソッドは、Webサイトのページネーション(ページ送り)を自作する際などに非常に重要になります。
ページネーションの仕組みのイメージ
- 1ページ目:
skip(0)->take(10)(最初の0件をスキップして、10件取得) - 2ページ目:
skip(10)->take(10)(最初の10件をスキップして、次の10件を取得) - 3ページ目:
skip(20)->take(10)(最初の20件をスキップして、次の10件を取得)
| メソッド名 | 役割 |
|---|---|
take() / limit() | 取得する件数を指定 |
skip() / offset() | 取得を開始する位置を指定 |
💡 サンプルコード (ページネーション風)
// 1ページあたりの表示件数を10件と設定
$perPage = 10;
// 現在のページ番号が2だと仮定
$currentPage = 2;
// スキップする件数を計算: (2ページ目 - 1) * 10件 = 10件スキップ
$skipCount = ($currentPage - 1) * $perPage;
$page_2_data = DB::table('products')
->orderBy('id')
->skip($skipCount)// 最初の10件をスキップ
->take($perPage)// 次の10件を取得
->get();
まとめ
| メソッド | 機能 | 使い分け |
|---|---|---|
take(N) | 取得件数をN件に制限 | より直感的でEloquentでよく使われる |
limit(N) | 取得件数をN件に制限 | SQLのLIMITに対応し、クエリビルダでよく使われる |
skip(N) | N件をスキップし、そこから取得開始 | ページネーションの開始位置指定に使う |
offset(N) | N件をスキップし、そこから取得開始 | skip()と同じ機能で、SQLのOFFSETに対応 |
Laravelのtake()とlimit()はどちらを使っても問題ありませんが、コードの意図が伝わりやすい方を選ぶのが良いでしょう。
今回の記事が、皆さんのLaravel学習の助けになれば嬉しいです。
それでは。