0
0

三項演算子で条件分岐させる

Last updated at Posted at 2024-01-03

はじめに

「依頼を探す」ページが表示される時は依頼の検索機能が、

そして「提案を探す」ページが表示される時には提案の検索機能が・・・

といったように、表示されるビューによって処理の内容を変えたい時は「三項演算子」を使うのが良いそうです。

『(expr1) ? (expr2) : (expr3) という式は、式1 が true の場合に 式2 を、 式1 が false の場合に 式3 を値とします。』(PHP公式ドキュメントより)

環境

PHP 8.2.7
Laravel 9.52.16

問題

  • 検索フォームを実装しようとしている
  • 提案・依頼の両方を検索できるようにしたい
  • つまり、表示するビュー次第でルートを分岐させたい
commons.search_form.blade.php
{{-- 今はまだ依頼の検索しかできないが将来的に提案の検索もできるようにしたい --}}
<div>
    <form action="{{ route('sales-search') }}" method="GET" class="flex">
        <input type="text" name="keyword" placeholder="キーワードで依頼を検索…" class="shadow appearance-none border rounded w-full py-1 px-2 text-gray-700 leading-tight focus:outline-none focus:shadow-outline mr-2">    
        <button type="submit" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-1 px-2 rounded focus:outline-none focus:shadow-outline">検索</button>
    </form>
</div>

解決策

  • 三項演算子を使う

commons.search_form.blade.php
{{-- これでアクセスするルートを分岐できる --}}
<div>
    <form action="{{ $isSalesPage ? route('sales-search') : route('purchases-search') }}" method="GET" class="flex">
        <input type="text" name="keyword" placeholder="キーワードで依頼を検索…" class="shadow appearance-none border rounded w-full py-1 px-2 text-gray-700 leading-tight focus:outline-none focus:shadow-outline mr-2">    
        <button type="submit" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-1 px-2 rounded focus:outline-none focus:shadow-outline">検索</button>
    </form>
</div>

関係するコントローラ内で、論理値を持たせる$isSalesPageを定義することにより、

現在表示しているページが「依頼」ページか「提案」ページかを判断します。

もし依頼ページが表示されていたら依頼を検索するロジックを持つコントローラに、

逆に提案ページが表示されていたら提案を検索するロジックを持つコントローラにルーティングされるようになります。

参考に、依頼に関するコントローラはつぎのようになっています

SalesOrdersController.php(一部)
// 最初に表示される「依頼」のページ
    public function othersSales()
    {
        $isSalesPage = true;

        $user = Auth::user();

        $othersSales = SalesOrder::where('user_id', '!=', Auth::id())->orderBy('created_at', 'desc')->paginate(10);

        return view('sales.others_sales', [ // この先にsearch_form.blade.phpが@includeされている
            'user' => $user,
            'othersSales' => $othersSales,
            'isSalesPage' => $isSalesPage, 
        ]);
    }
    
// $isSalesPageがtrueの時にルーティングされる
    public function search(Request $request)
    {
        $isSalesPage = true;

        $user = Auth::user();

        $keyword = request('keyword');

        $othersSales = SalesOrder::where('user_id', '!=', Auth::id())->where('title', 'like', "%{$keyword}%")->orderBy('created_at', 'desc')->paginate(10);

        return view('sales.others_sales', [
            'user' => $user,
            'othersSales' => $othersSales,
            'isSalesPage' => $isSalesPage,
        ]);
    }

おわりに

分岐処理ができるところを、別のファイルを作ることで対応していた節もあるので、

これを機により効率的なコーディングを意識したいと思います。

0
0
2

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
0
0