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

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

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

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

Laravel 5

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

Q&A

1回答

2401閲覧

Laravel5 検索フォームに関して

marrymejyj

総合スコア8

PHP

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

Laravel 5

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

0グッド

0クリップ

投稿2016/09/27 07:03

編集2016/09/28 00:14

###前提・実現したいこと
Laravelで検索フォームを作成しているところです。
そこで配列に結果は見えますが、実際にテンプレの方に反応が有りません。

###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード
view

Laravel5

1{!! Form::open(['url'=>'searchinput']) !!} 2省略 3{!! Form::close() !!}

Route

Laravel5

1Route::post('searchinput', 'HotelController@searchInput');

Controller

Laravel5

1public function searchInput(){ 2 $input = Request::all(); 3 HotelController::searchHotel($input); 4 return redirect('/'); 5 }

Laravel5

1public function searchHotel($input){ 2 3 $search_result = DB::connection('mysql')->table('keyword_mst_world') 4 ->where('keyword', 'LIKE', '%'.$input['hotel_name'].'%') 5 ->get(); 6 7 return view('index')->with('search_result', $search_result); 8 9 }

Controller
元々データを表示している関数

Laravel5

1 public function getIndex(){ 2 3 4 $res = DB::connection('mysql')->table('table') 5 ->where('disp_flg', 'disp') 6 ->get(); 7 8 9 return view('index', ['res' => $res]); 10 }

View
検索の結果があるときに

Laravel5

1@if (isset($search_result)) 2 @foreach($search_result as $k => $v) 3 {{ $v->keyword }} 4 @endforeach 5@else 6 no result 7@endif

###試したこと
postで渡したときにちゃんとFormの値が渡されるのを確認して、
関数「searchHotel」でddを利用し、$search_resultを確認したときも
イメージ説明
でることを確認しましたが、なぜかViewのところに反映されません。
なぜでしょうか?
###補足情報(言語/FW/ツール等のバージョンなど)
PHP 7
Laravel 5.2.41
Template Blade

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

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

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

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

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

Archsted

2016/09/27 17:57 編集

Routeの記述から、フォームでpostした結果searchInputメソッドが呼ばれているみたいですが、このメソッド内はどういう処理になっていますか?
marrymejyj

2016/09/28 00:15 編集

public function searchInput(){ $input = Request::all(); HotelController::searchHotel($input); return redirect('/'); } Inputを発生させ、searchHotelに行けるようにしています。 本文に追加しておきました。
guest

回答1

0

直接の原因としては、POSTした結果のsearchInputメソッドのreturn値が、
単なるドキュメントルートへのリダイレクトだけになっている事かと思います。

searchHotelメソッドは呼ばれているのですが、実質そのreturn値の内容
(indexビューを表示し、検索結果が$search_resultで取得できるようになる)
が利用されておらず、無視されてしまっています。

乱暴な例になって恐縮ですが、以下のようにすると動作しませんか?

PHP

1public function searchInput() { 2 $input = Request::all(); 3 return HotelController::searchHotel($input); 4}

searchHotelメソッドでは単純に検索結果の$search_resultをそのままreturnし、
searchInputメソッドはsearchHotelメソッドを呼んで検索結果を取得した後、最後で

return view('index')->with('search_result', $search_result);

とすると考えやすいかと思います。


コメントの内容を受けて追記

最初に私が挙げた回答ですと、検索結果のデータはビューに送っていますが、一覧のデータをビューに送っていないため、一覧を表示する所でエラーが出てしまったのだと思います。

ビューに複数種のデータを表示したい場合(仮に一覧が$res、検索結果が$search_resultに格納されているならば)Controllerの最後でビューを返す際に、以下のように書けます。
(withを使う書き方もあります。要はいくつものデータを同時にビューに渡せるという事です)

PHP

1 2return view('index', ['res' => $res, 'search_result' => $search_result]); 3return view('index', compact('res', 'search_result')); // こう書いても同等 4

marrymejyjさんの書かれたコードですと、「データの取得部分」と「コントローラとしての振る舞い」が同居してしまっているため、分離した方がいいと思われます。
現在のソースをベースに、日本語交え大雑把に書くと以下のような感じでしょうか。

PHP

1 2// Controller 3public function 一覧表示() // getIndexにあたるもの 4{ 5 $res = データ一覧を取得する処理(); 6 7 return view('index', ['res' => $res]); 8} 9 10public function 検索と結果表示() // searchInputにあたるもの 11{ 12 $input = Request::all(); 13 $search_result = 検索結果を取得する処理($input); 14 15 $res = データ一覧を取得する処理(); 16 17 return view('index', ['res' => $res, 'search_result' => $search_result]); 18} 19

データ一覧を取得する処理()検索結果を取得する処理() の最後は
viewreturnするのではなく、単純にデータベースの検索結果をreturnしてあげてください。
データ一覧を別の画面で出したいような場合に、同じメソッドが使い回せるようになります。

一例としてお試しください。

投稿2016/09/28 02:58

編集2016/09/28 07:14
Archsted

総合スコア452

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

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

marrymejyj

2016/09/28 05:35

返信ありがとうございます。 教えて頂いた通り作成してやってみましたが、どうやらできないらしいんです。 推測される原因としては return HotelController::searchHotel($input); このようにReturnして次のメソッドに行って 結果を return view('index')->with('search_result', $search_result); このようにReturnするのですが、 既存にページを構成していたgetIndexというところがあり、 Bladeの方でgetIndexのメソッドから読んでる変数があるため、 searchHotelではその関数がないため、エラーが発生するようです。 なんか説明がぐちゃくちゃですが、もし不明な点がございましたら、また声かけてください! どうぞよろしくお願い致します。
Archsted

2016/09/28 06:25

大体事情はわかりました。一つ確認させてください。 現在一覧を表示している画面(index)があると思いますが、検索結果を表示したい画面は一覧と同じ画面ですか? (検索結果と、一覧を同時に表示したいと考えていますか?)
marrymejyj

2016/09/28 06:27

そうですね、おっしゃる通りIndexの画面に検索の結果を表示させたいです。
Archsted

2016/09/28 07:15

回答を追記しました。 具体的なコードの明記までは避けましたが、いかがでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問