質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

2959閲覧

laravel5 ページネーションにてクエリービルダーのtake()が使えない

konkon-fff

総合スコア10

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2016/07/15 07:40

編集2016/07/15 07:50

php 5.6.19
laravel 5.1
windowsでlaravel5の勉強をしております。
クエリービルダーでDBから値を取得する際に、take()を利用することで
取得する数を指定できるとあり下記のように実行しました。

php

1$test = DB::table('hoge')-> 2 select('a','b')->take(100)->get();

こちらは想定通り100件取得し、それをViewに渡しtableとして表示出来ました。

ただ、100件の表示も多いのでその部分を20件ずつ表示するようページネーションを利用
しようと下記のように変更しました。

php

1$test = DB::table('hoge')-> 2 select('a','b')->take(100)->paginate(20);

このようにするとViewでは正しくページネーションできてはいるのですが
ページへのリンクが10件表示されておりtake()が正常に動いてないように感じます。
(100件のうち20件ずつ表示するのページ数としては最大で5ページになることを想定しておりました。)

下記のリンクよりgroupBy()を利用した場合は、ページネーションがうまく動かないということは確認できたのですが、take()については他のサイト等でも発見できません。
http://readouble.com/laravel/5/1/ja/pagination.html

laravel5ではtake()とページネーションは正しく動作しないものなのでしょうか?
もしくは私のクエリーの書き方がよくないのでしょうか?

不足している情報があれば教えて頂ければと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

手元の環境でページネーションとtakeを同時に実行し、発行されているSQLを確認してみました。
なお、hogeテーブルには4件の情報が入っています。

PHP

1\DB::enableQueryLog(); 2$hugas = \DB::table("hoge")->take(3)->paginate(2); 3dump(\DB::getQueryLog());

dumpの内容は以下のようになっていました。

PHP

1array:2 [2 0 => array:3 [3 "query" => "select count(*) as aggregate from `hoge`" 4 "bindings" => [] 5 "time" => 0.33 6 ] 7 1 => array:3 [8 "query" => "select * from `hoge` limit 2 offset 0" 9 "bindings" => [] 10 "time" => 0.22 11 ] 12]

結果から言うと、paginate実行時、発行されているSQLにはtakeの数値は反映されていないように見えます。
(ビュー上のリストにも、4件全てがページ分けされつつ表示されてました。)

もしもtake込みで実現するならば、事前にtakeで100件の配列を作成し、
[ Illuminate\Pagination\Paginator ] か [ Illuminate\Pagination\LengthAwarePaginator ]インスタンスを生成して独自ページネーションを作ってみてはいかがでしょうか?

投稿2016/07/15 08:39

yosida001

総合スコア56

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

konkon-fff

2016/07/19 00:43

ご回答ありがとうございます。 \DB::getQueryLog()でクエリーを取得できるとことも含め、勉強になりました。 ページネーションは独自で挑戦してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問