mondo-spdf
@mondo-spdf

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

laravelセレクトボックスを使った昇順降順の機能を作りたい

解決したいこと

laravelでサイトを作っています。
作ったサイトを追加する機能を作ったのですが、作ったサイトをcreated_atで並べ替えをする機能を加えて作ろうと思ったのですが、うまくいきません。

sites/index.blade.php
        <form method="post"action="{{ action('SitesController@index') }}">
        @csrf
            <select name="sortSites" id="sortBySites">
                <option value="asc">新着順</option>
                <option value="desc">投稿順</option>
            </select>
            <input type="submit">
        </form>
SitesController.php
    function index(Request $request){
        if($request->sortSites == 'asc'){
            return view("sites.site_index")->with("sites", Site::orderBy('created_at', 'desc')->get());
        } elseif($request->sortSites == 'desc') {
            return view("sites.site_index")->with("sites", Site::orderBy('created_at', 'asc')->get());
        } else {
            return view("sites.site_index")->with("sites", Site::latest()->get());
        }
    } //汚くてすみません;

上のコードで自分が作ったサイトを並び替えることができると思ったのですが、うまくいきません。
投稿順を選んでsubmitしても並び替えされないですし、セレクトボックスの値も初期値の新着順に戻ってしまいます。

いろいろ試してみると、if文内のelseの部分をlatestからoldestにすると並び替えされました。つまり、ifが機能しておらず、問答無用でelseにもってかれているようなのですが、理解ができていません。

どなたか助言をいただけると幸いです。

ゆくゆくはページの更新なしで並び替えを、部分的に更新して作りたいと思っているのですが、

0

3Answer

ifが機能しておらず

まずこれを解決するのが最優先かも知れないですね。
全てelseに行ってしまうのは一つ目と二つ目のifの評価式にfalseが入っているからです。
下記のいずれかの様にデバッグして$request->sortSitesの値を確かめてみてはいかがでしょうか。

dump($request->sortSites);
dd($request->sortSites);

0Like

Comments

  1. @mondo-spdf

    Questioner

    ありがとうございます!

    上のコードを書いてみたらどちらもnullでした;;
    値が入っていないということはつまりはどうすればいいのでしょうか?
  2. まず$requestに値が取得できているか確かめてみたほうが良いですね。
    下記で確認できると思います。

    dump($request);

    もしこちらにも値がなければ正しく値が送られていないという事なので、正しくFormをPOSTする方法を調べるところからになると思います。
  3. @mondo-spdf

    Questioner

    返信ありがとうございます!
    dumpさせてみて見てみても値がなかったので正しく送信されてないのかなと思いました。

    ちなみにweb.phpはこのようにしているのですが、indexを重ねて使っているのが問題だったりしますか?

    web.php
    ~~~
    Route::get('/sites', 'SitesController@index');
    Route::post('/sites', 'SitesController@index');
    ~~~

form の method と action がくっついているのが気になります。
また細かい話ですが HTTP 上は、 method は 大文字で書くのが正しいです(小文字のままでも動いてしまうかもしれませんが)。

試しに以下のように修正したらどうでしょうか?

- <form method="post"action="{{ action('SitesController@index') }}">
+ <form method="POST" action="{{ action('SitesController@index') }}">
  @csrf
      <select name="sortSites" id="sortBySites">
0Like

Comments

  1. @mondo-spdf

    Questioner

    ありがとうございます!
    そうなんですね、まだまだ勉強し足りないです...!
    直してみても実行結果は変わりませんでした。。。

Laravel8の入力データの取得方法は次のとおりです。
Laravel 8.x HTTP Requests 入力

使用しているLaravelのバージョンとドキュメントを確認してみてください。

あと$_POSTの方はdumpしてみましたか?
こちらに値が入っているなら、フォームやPHP自体に問題はないと思います。

0Like

Comments

  1. @mondo-spdf

    Questioner

    何度もありがとうございます!
    $_POSTをdumpしてみたら何も入っていませんでした。。。

    改めて全部見直してみたいと思います。
    url紹介ありがとうございます!
    これからも壁に当たりながら少しずつ頑張ってみたいと思います...!

Your answer might help someone💌