【Laravel】all()の後にpaginateが使えない?原因と解決方法

こんにちは!CODE CLUB965のKです!

今回は、LaravelでDBからデータを取得する際に、テーブルのデータを全て取得してpaginateで取得件数を指定したいときに起きた事を書こうと思います。

all()の後にpaginateが使えなかった

Usersというテーブルから作成日順に並び替えてから、paginateを使って10件ずつデータを表示したかったので、

$users = Users::all()->sortBy("created_at")->paginate(10);

で、大丈夫だと思い実行してみるとエラーになってしまいました。

エラーの内容は、

Method Illuminate\\Database\\Eloquent\\Collection::paginate does not exist.

と出ていました。

「paginateがない!?なんで?」となりましたが、調べてみるとちゃんと原因がありました。

原因と解決方法

まず、原因ですが簡単にまとめると、all()というメソッドはcollectionメソッドであり、collectionメソッドにはpaginateのようなメソッドがないためエラーが出たようです。

StackOverflowにも私と同じようなことで質問をしている方がいましたので、参考に見てみるといいと思います。
https://stackoverflow.com/questions/48148472/laravel-method-paginate-does-not-exist

解決方法ですが、

Users::orderBy('created_at')->paginate(10);

これで、問題なくできました。

よく見ると、最初に書いたコードは、「sortBy」を使っていますが、これはcollectionメソッドなので使えません。
そのため、「orderBy」を使っています。

ちなみに、複数の条件で並び替えたい場合は「orderByRaw」を使うといいです。

最後に

ちょっとした事ですが、知らないとなんでエラーが出たのか分からないので意外と焦りますよね。笑

でも、ちゃんとエラーの内容を読んで調べれば、必ず解決に繋がる情報はあるので、落ち着いて対応しましょう。

それでは、また!

Follow me!