#概要
Laravelでルーティングをしようと思った際に困ったことがあり、ネットにあまり情報がなかったので備忘録として投稿しました。
初めてQiitaに投稿するので至らないところがあると思いますがご了承下さい。
また、PHPに触れるのも2,3週間ほどしか経っていないです。
##困ったこと
/routes/web.phpにルーティングについての記述をしていました。
Route::get('/sql/hogehoge', function () {
return view('sql/hogehoge');
});
Route::get('/sql/hogehoge/', 'SQLController@search');
Route::post('/sql/hogehoge/', 'SQLController@searchResults');
Route::get('/sql/hogehoge/', 'SQLController@index1_search');
Route::post('/sql/hogehoge/', 'SQLController@index1_searchResults');
public function search(){
$sql = "SELECT name FROM tables";
$stmt = $pdo->prepare($sql);
$stmt->execute();
return view('sql/hogehoge', [
'names' => $stmt
]);
}
public function searchResults(){
$name_id = request('name');
return $name_id;
}
public function index1_search(){
$sql = "SELECT date FROM tables";
$stmt = $pdo->prepare($sql);
$stmt->execute();
return view('sql/hogehoge', [
'dates' => $stmt
]);
}
public function index1_searchResults(){
$date_id = request('date');
return $date_id;
}
Route::get()の第1引数にはURLを書きます。第2引数にはどこのメソッドで処理をするのか書きます。
上記の例ですとhttp://localhost/sql/hogehoge と検索したときにSQLController.phpにあるsearchメソッドが呼び出されて処理が行われるという意味になります。
また、SQLController.phpで処理したデータを表示させるために以下のresult.php(仮称)を作成しました。
<form action ="./SQLController" method="POST">
<label for="Hogehoge">Hogehoge</label>
<select class="form-control" id="name" name="name">
<option value="" selected></option>
<?php
if(isset($names))
foreach ($names as $v) { ?>
<option value=<?php echo $v["first"]; ?>><?php echo $v["last"]; ?></option>
<?php } ?>
</select>
</form>
<form action ="./SQLController" method="POST">
<label for="Tournament">Tournament</label>
<select class="form-control" id="date" name="date">
<option value="" selected></option>
<?php
if(isset($dates))
foreach ($dates as $v) { ?>
<option value=<?php echo $v["month"]; ?>><?php echo $v["year"]; ?></option>
<?php } ?>
</select>
</form>
だいぶ省略していますがこれを実行しようとするとプルダウンメニューがname用とdate用で2つでてくるのですが、なんとdate用のプルダウンメニューしかsqlの処理がなされませんでした。name用のプルダウンメニューには何も表示されませんでした。
##原因
原因はweb.phpにありました。
Route::get('/sql/hogehoge/', 'SQLController@search');
Route::post('/sql/hogehoge/', 'SQLController@searchResults');
Route::get('/sql/hogehoge/', 'SQLController@index1_search');
Route::post('/sql/hogehoge/', 'SQLController@index1_searchResults');
上記ではRoute::getの第1引数が同じものを使っていることがわかると思います。
同じものを記述するとあとに記述したもの(ここではSQLController@index1_searchResults)が優先されて実行されるようです。
実際そのような結果が筆者は確認できました。
##解決方法
同じ第1引数を記述したことに原因があるのでそれについて変更を加えました。
web.phpは処理をするメソッドを一つにまとめました。
Route::get('/sql/hogehoge/', 'SQLController@search');
Route::post('/sql/hogehoge/', 'SQLController@searchResults');
それにともないSQLController.phpのほうのメソッドも一つにまとめました。
public function search(){
$name_sql = "SELECT name FROM tables";
$name_stmt = $pdo->prepare($name_sql);
$name_stmt->execute();
$date_sql = "SELECT date FROM tables";
$date_stmt = $pdo->prepare($date_sql);
$date_stmt->execute();
return view('sql/hogehoge', [
'names' => $name_stmt,
'dates' => $date_stmt
]);
}
public function searchResults(){
$name_id = request('name');
return [$name_id, $date_id];
}
メソッドで複数の値を返したいときはreturn [];の形で書きます。
以上のようにしてみたら上手く複数のプルダウンメニューが表示できるようになりました。
##おわりに
コードは適当に変数や値をつけてしまった部分があるので間違いがあると思います。
ほかにもいい方法があるのかもしれませんが、3,4時間ほど悩んでようやく解決できた苦痛を他の方々にも味わってほしくないと思い、ここに書き記しました。
なにか間違い等ありましたら教えて下さい。また、ほかにもなにかいい方法がありましたら教えて下さい。