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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Q&A

解決済

1回答

489閲覧

Laravel8で、ページネーションに加えて別な値を渡したい

Cik_imi

総合スコア12

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

0グッド

0クリップ

投稿2023/03/12 23:38

編集2023/03/13 05:55

実現したいこと

Laravelにて、ページネーションのページ番号に加えてボタンに指定した値をコントローラーに渡したいと思います。

前提

ページネーションしたページにボタンを配置して、ボタンを押すとそのボタンに指定された条件にてDBから選択し、結果を表示するページを作成しています。

  1. 最初にページを開いたときは、全件検索し、ページネーションした結果が表示されてます(引数はなし)。
  2. そのページにはいくつかのボタンを配置します(ボタンは、同じカラムから選択して絞るための条件を指定する)。
  3. ボタンを押すことでURLにpageと、ボタンに割り当てた条件を設定します。
  4. 同じページに条件を絞った結果を表示します。

発生している問題

URLに渡す引数をどのように記述したらいいのでしょうか。
URLの例(図の「2」をクリックしたとき)
https://192.168.xxx.xxx/books?page=2?kd=b
(下記のソースコードの場合に渡したい引数を示します)
イメージ説明

該当のソースコード

books.blade.php

1 {{ Form::open(['method' => 'get']) }} 2 <div> 3 {{ Form::button('a', ['class' => 'btn', 'name' => 'kd', 'value' => 'a', 'type' => 'submit']) }} 4 {{ Form::button('b', ['class' => 'btn', 'name' => 'kd', 'value' => 'b', 'type' => 'submit']) }} 5 {{ Form::button('c', ['class' => 'btn', 'name' => 'kd', 'value' => 'c', 'type' => 'submit']) }} 6 </div> 7 {{ Form::close() }} 8 9 <table> 10 <tr> 11 <th>タイトル</th> 12 <th>詳細</th> 13 <th>種類</th> 14 </tr> 15 @foreach ($books as $book) 16 <tr> 17 <td>{{ $book->title }}</td> 18 <td>{{ $book->description }}</td> 19 <td>{{ $book->kinds }}</td> 20 </tr> 21 @endforeach 22 </table> 23 24 {{ $books->links('vendor.pagination.bootstrap-4') }} 25

BooksController.php

1class BooksController extends Controller 2{ 3 public function show(Request $request) 4 { 5 $view = view('books'); 6 7 if($request->has('kd')) { 8 $kd = $request->query('kd'); 9 } 10 else { 11 $kd = 'a'; 12 } 13 14 // 確認 15 dump($request->query(), $kd ); 16 17 $books = Book::where('kinds','=',$kd)->paginate(5); 18 $view->kd = $kd; 19 return $view->with(['books' => $books], ['paginate_params' => ['kd' => $kd ]]); 20 } 21}

試したこと

(1) 上記の

return $view->with(['books' => $books], ['paginate_params' => ['kd' => $kd ]]);

では、URLに表示されないようです。

(2) paginate の「2」をクリックしたときに値が引き継がれるようにするため、次を試しましたが、想定した動作とはなりませんでした。

{{ dump($kd ); }} {{-- {{ $books->links('vendor.pagination.bootstrap-4') }} --}} {{-- 上から下に変更 --}} {{ $books->appends(request()->query('kinds','=',$kd))->links('vendor.pagination.bootstrap-4') }}

ラジオボタンの使用も考えましたが、ボタンは1クリックで済み操作が簡単なため、ボタンを使用したいと思います。

補足情報(FW/ツールのバージョンなど)

Laravel Framework 8.83.5
PHP 7.3.33

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

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

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

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

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

guest

回答1

0

自己解決

その後、かなり調べたところ次の方法でパラメーターを渡すことができ、解決しました。

books.blade.php

1{{ $books->appends(array('kd' => $kd))->links('vendor.pagination.bootstrap-4') }}

このようにすることで

URL

1http://192.168.xxx.xxx/a/books?kd=b&page=2

paginate の「2」をクリックしたときに上記となり、URLに複数の指定が可能でした。

参考にさせていただいたウェブページ:https://nextat.co.jp/staff/archives/37
ありがとうございました。

投稿2023/03/13 12:02

編集2023/03/13 12:13
Cik_imi

総合スコア12

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

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

phper.k

2023/03/14 01:11

コントローラ側で、 Model::query()->paginate()->withQueryString(); と paginate() のあとに withQueryString() をつけるだけ ->appends(array('kd' => $kd)) は不要
Cik_imi

2023/03/14 05:21

この方法は知りませんでした。オブジェクトにqueryが含まれていることは確認しました。 簡単な記述でできることが分かり、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問