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

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

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

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

Laravel 5

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

Q&A

解決済

2回答

2038閲覧

Laravel solarium ページネーション ページ遷移先にデータが表示されない

yuuuui

総合スコア59

PHP

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

Laravel 5

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

0グッド

0クリップ

投稿2017/06/09 12:53

編集2017/06/13 11:00

###solariumのpaginationを実現したい
solrの全文検索システムを作っています。
ページネーション機能を実装中にページ遷移先にデータが参照されませんでした。

###pagination実装ソースコード(Laravelのカスタムページネータを使用)修正前

PHP

1SearchController.php 2 3//クエリ 4$query = $this->client->createSelect(); 5$query->setQuery($request['keyword']); 6 7//クエリの結果を取得 8$resultset = $this->client->select($query); 9 10 11//ページネーション 12$perPage = $query->getRows(); //defalutの10件 13$startPage = $query->getStart(); //defalutの0件 14 15// Illuminate\Pagination\LengthAwarePaginator を使用し、カスタムページネータを作成 16 17//カスタムページネータ 18 $perPage = 10; 19 $startPage = $query->getStart(); //0 20 21// ページ番号 22 $page = max(0, Paginator::resolveCurrentPage() - 1); 23 24 $paginator=NULL; 25 foreach ($resultset as $document) { 26 27 // ページ内の要素を取得 28 $sliced = array_slice((array)$document->id, $page * $perPage, $perPage); 29 30 31 // ページネータインスタンス生成 32 $paginator = new LengthAwarePaginator( 33 $sliced, 34 $resultset_total,//$resultset_total = $resultset->getNumFound(); 35 $perPage, 36 null, 37 [ 38 'page' => $page, 39 'path' => Paginator::resolveCurrentPath(), 40 ] 41 42 ); 43 44 }

###修正後↓(解決)

PHP

1SearchController.php 2 3 4$query = $this->client->createSelect(); 5$query->setQuery($request['keyword']); 6 7$perPage = $query->getRows(); //defalutの10件 8$startPage = $query->getStart(); //defalutの0件 9 10 11 $page = max(0, Paginator::resolveCurrentPage()); //-1を削除 12 13 // 配列のoffset位置からperPage分の配列を切り抜く 14 $offset = ( $page * $perPage ) - $perPage; 15 16 $sliced = $query->setStart($offset)->setRows($perPage); 17 dump($sliced); 18 19 //結果 20 $resultset = $this->client->select($query); 21 22//結果を全件取得 23 $resultset_total = $resultset->getNumFound(); 24 25 $paginator = new LengthAwarePaginator( 26 $sliced, 27 $resultset_total, 28 $perPage, 29 $page, 30 [ 31 'page' => $page, 32 'path' => Paginator::resolveCurrentPath(), 33 'query' => ['keyword' => $request['keyword']], 34 35 ] 36 37 );

PHP

1search.blade.php 2 3<ul> 4 <li>{{ $paginator }}</li> 5</ul> 6

ページネーションはブラウザに表示されているが
2ページ目を押下するとURLはhttp://xxx.x.x.x/list?keyword=〇〇&page=2となりますが
結果は表示されない。
(1ページ目に全件表示されている)

###試したこと
https://stackoverflow.com/questions/17501630/how-do-you-paginate-in-solr-using-solarium
上記を参考にし、下記のようなlimitをつけて参照するようにする → 結果変わらず

$query->setStart(0)->setRows(20);

###バージョン
Laravel5.4
solarium 3.8
solr 5.5.4

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

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

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

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

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

guest

回答2

0

ベストアンサー

追記:すいません、別の解答欄に書いてしまいました…

なるほどです。

solrとsolariumは使ったことがなかったので、少し調査してみました。
どうやら、setStart()とsetRows()を使うことで、何番目から何件とってくるか指定できるのですね。(array_sliceと同じこと)

でしたら、array_sliceは不要かもしれませんね
何度も試してもらって申し訳ないですが、client->selectしているところと
array_sliceの文をコメントアウトし、offsetの計算文の下に以下を追加してみてください。

$query->setStart($offset)->setRows($perPage);

ページが進むにつれて、取得する開始位置(offset)をずらしていくといいのかなと。

投稿2017/06/13 07:44

編集2017/06/13 07:46
s-washion

総合スコア204

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

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

yuuuui

2017/06/13 09:26

> solrとsolariumは使ったことがなかったので、少し調査してみました すみません。わざわざ調査してくださりありがとうございます。 修正後のソースを更新しました。 確認したところ、setStart()が次ページへ行くと変更されました! ありがとうございます。 > array_sliceと同じこと 勉強不足で同じことだとは気づけませんでした。 ありがとうございます。 検索するにあたってクエリを $query = $this->client->createSelect(); $query->setQuery($request['keyword']); と、最初で投げているのですが、ここが次ページの遷移先でNULLになってしまい参照されていないようでした。。 ここができれば解決できそうです。 もう少しお力をお借りできませんでしょうか。。 大変申し訳ございませんがよろしくお願いします。
s-washion

2017/06/13 10:27

いえいえ。自分も勉強になっていますのでお気になさらずに 自分で環境を作ってみて試しました(笑 都道府県のテストデータで試したので若干異なりますが、 ソースを載せてみます。 /* 都道府県市町村を取得するやつ public function towncode(Request $request) { $query = $this->client->createSelect(); $query->setQuery("todouhuken:".$request['keyword']); $perPage = $query->getRows(); //defalutの10件 $page = max(0, Paginator::resolveCurrentPage()); $offset = ( $page * $perPage ) - $perPage; $query->setStart($offset)->setRows($perPage); $resultset = $this->client->select($query); // ここ重要。getNumFoundでHitした全件数を取得 // count($resultset)だと10件なのでページングしない $resultset_total = $resultset->getNumFound(); $paginator = new LengthAwarePaginator( $resultset, $resultset_total, $perPage, $page, [ 'path' => Paginator::resolveCurrentPath(), 'query' => ['keyword' => $request['keyword']], // こうするとページリンクにkeywordクエリーが引き継がれる ] ); return view('towncode', ['paginator' => $paginator]); } -- towncode.blade.php <!doctype html> <html lang="{{ config('app.locale') }}"> <head> <meta charset="utf-8"> <!-- Fonts --> <link href="https://fonts.googleapis.com/css?family=Raleway:100,600" rel="stylesheet" type="text/css"> <!-- Bootstrap--> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha256-KXn5puMvxCw+dAYznun+drMdG1IFl3agK0p/pqT9KAo= sha512-2e8qq0ETcfWRI4HJBzQiA3UoyFk6tbNyG+qSaIBZLyW9Xf3sWZHN/lxe9fTh1U45DpPf07yj94KsUHHWe4Yk1A=="crossorigin="anonymous"></script> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootswatch/3.3.7/cosmo/bootstrap.min.css" integrity="sha384-h21C2fcDk/eFsW9sC9h0dhokq5pDinLNklTKoxIZRUn3+hvmgQSffLLQ4G4l2eEr" crossorigin="anonymous"> </head> <body> <div class="container"> <ul> @foreach ($paginator->items() as $item) <li>{{ $item->todouhuken }}: {{ $item->shichouson }}</li> @endforeach </ul> </div> {{ $paginator }} </body> </html> 見にくいですが、参考にしてみてください。
yuuuui

2017/06/13 10:53

> 自分で環境を作ってみて試しました(笑 おっしゃっていただいたように修正後クエリを引き継ぐことができました。 とても助かりました!長々とお付き合いいただきまして本当にありがとうございました。 私一人では解決できませんでした。 ページネーションが行えた修正のソース更新しました。 本当にありがとうございました。
s-washion

2017/06/13 10:56

解決されたようでよかったです! こちらこそ勉強になりました。
guest

0

こんにちは

LengthAwarePaginatorのドキュメントを見てみますと
constractの第4引数(nullが設定されているところ)は、
現在ページ数を指定するようになっていますので、$pageを指定してみるといいのかなと思います。

ご参考にしてみてください。

投稿2017/06/12 07:41

編集2017/06/12 07:52
s-washion

総合スコア204

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

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

yuuuui

2017/06/12 08:25

ご回答いただき、ありがとうございます。 教えいただいた通りにnullを$pageに変更してみましたが期待する動作をしませんでした。。
s-washion

2017/06/12 08:54

おっと。すいません! ソースを拝見すると、すこしおかしい感じがあります。 まず、LengthAwarePaginatorのconstractの第1引数に array_sliceされたものを指定されていますが、ここは全itemなので $resultsetでいいと思います。 また、foreach内でLengthAwarePaginatorをnewしていますが、 繰り返しする必要はないかと思いますので、foreachをコメントアウトしてみてください。
yuuuui

2017/06/12 09:21

こちらこそすみません。度々ありがとうございます。 > まず、LengthAwarePaginatorのconstractの第1引数に array_sliceされたものを指定されていますが、ここは全itemなので $resultsetでいいと思います。 こちら、お教えいただきました$resultset へ変更し、foreachをコメントアウトしましたがページ遷移先にデータは参照されませんでした。 1ページ目に全ての結果件数が表示されてしまい、1ページ辺りの件数が分割がされていないように思えました。
s-washion

2017/06/12 09:54

うーん、力になれずすいません。 $resultset_totalに値が入っていませんが本番ソースでは入っていますかね? ($resultsetはきちんとデータが取れているという認識でいいですよね?) あと、質問欄のソースを修正後ソースに更新してもらうと助かります。
yuuuui

2017/06/12 10:11

いえいえ。ご回答いただけるだけでも嬉しく思います。 ありがとうございます。 > あと、質問欄のソースを修正後ソースに更新してもらうと助かります。 こちら、大変失礼しました。 修正後ソースを追加いたしました。ご確認を宜しくお願い致します。
s-washion

2017/06/13 01:13

修正ソースありがとうございます。 すいません。 一点、間違ったことを言ってました。! LengthAwarePaginatorの第一引数は、表示させる分のみ指定するようです。全配列と言ってました。すいません。 以下のソースようにするとどうでしょうか? // -1を削除してます $page = max(0, Paginator::resolveCurrentPage()); // 配列のoffset位置からperPage分の配列を切り抜く $offset = ( $page * $perPage ) - $perPage; $sliced = array_slice($resultset, $offset, $perPage, true); $paginator = new LengthAwarePaginator( $sliced, $resultset_total, $perPage, $page, //NULLから$pageへ変更 [ 'page' => $page, 'path' => Paginator::resolveCurrentPath(), ] );
yuuuui

2017/06/13 05:02

> LengthAwarePaginatorの第一引数は、表示させる分のみ指定するようです。全配列と言ってました。すいません。 いえ!勉強になりました。ありがとうございます。 修正後のソースを編集させていただきました。 確認したところ、dump($offset);では期待する数値を確認取れました! ありがとうございます。(次ページに遷移した時に次の件数の値が表示されています) 現時点は1ページ目に全件のsolrの結果が参照されています。 solrから参照する件数の設定に問題がありそうです。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問