LoginSignup
3
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-07-14

概要

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

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3