Help us understand the problem. What is going on with this article?

Laravelで同じURLにルーティングをする方法

概要

Laravelでルーティングをしようと思った際に困ったことがあり、ネットにあまり情報がなかったので備忘録として投稿しました。
初めてQiitaに投稿するので至らないところがあると思いますがご了承下さい。
また、PHPに触れるのも2,3週間ほどしか経っていないです。

困ったこと

/routes/web.phpにルーティングについての記述をしていました。

/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');

SQLController.php
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(仮称)を作成しました。

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にありました。

/routes/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は処理をするメソッドを一つにまとめました。

/routes/web.php
Route::get('/sql/hogehoge/', 'SQLController@search');
Route::post('/sql/hogehoge/', 'SQLController@searchResults');

それにともないSQLController.phpのほうのメソッドも一つにまとめました。

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時間ほど悩んでようやく解決できた苦痛を他の方々にも味わってほしくないと思い、ここに書き記しました。

なにか間違い等ありましたら教えて下さい。また、ほかにもなにかいい方法がありましたら教えて下さい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした