ichihhd
@ichihhd

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で作成しているのですが、価格を上限下限を設けた方法で検索したいのですがうまく作動しません。

発生している問題・エラー

エラーなどは出ませんが、価格の検索が引っ掛からない。

該当するソースコード

product.blade.php

<div class="search">
  <form action="{{ route('product') }}" method="GET">
  @csrf
  <!-- 検索フォーム -->
  <div class="product_name.search">
  <label for="product_name">{{ __('商品名') }}</label>
    <input type="text" name="keyword" id="keyword" >
  </div>  

  <div class="company_name.serch">
  <label for="company_name">{{ __('メーカー') }}<span class="badge badge-danger ml-2">{{ __('必須') }}</span></label>
        <select class="form-control" name="search" id="search">
          <option>{{"メーカーを選択してください"}}</option>
        @foreach ($companies as $company)
         <option>{{ $company->company_name }}</option>
         @endforeach
        </select>
  </div>

  <div class="price.search">
    <label for="price">{{ __('価格') }}</label>

    <div class="jougen">
    <p>{{ __('上限') }}</p>
    <input type="number" name="jougen.price" id="jougen.price" >
    </div>

    <div class="kagen">
    <p>{{ __('下限') }}</p>
    <input type="number" name="kagen.price" id="kagen.price" >
    </div>

  </div>

productcontroller.php

 public function showList(Request $request)
    {
         // 商品一覧画面表示/検索処理

        $keyword = $request->input('keyword');
        $search = $request->input('search');
        $jougenprice = $request->input('jougen.price');
        $kagenprice = $request->input('kagen.price');
        $jougenstock = $request->input('jougen.stock');
        $kagenstock = $request->input('kagen.stock');
        

       
        $nonon = new Product();

        // メーカーの検索部分の値挿入
        $model = new Company();
        $companies = $model ->getCompanyNameById();



        $products = $nonon->search($keyword,$search,$jougenprice,$kagenprice,$jougenstock,$kagenstock);
       
            
        return view('product', compact('products','keyword','companies','search','jougenprice','kagenprice'));
           
        
    }

Product.php

public function search($keyword,$search,$jougenprice,$kagenprice)
    {
        // 検索処理
        $products = DB::query();

        $products= DB::table('products')
        ->join('companies','company_id','=','companies.id')
        ->select('products.*','companies.company_name');

        if($keyword){
            $products->where('product_name', 'LIKE', "%$keyword%");
        }

        if($search){
            $products->where('company_name', 'LIKE', "%$search%");
        }

        // 確認していただきたいところ
        if($jougenprice){
            $products->where('price','>',$jougenprice);
        }elseif($kagenprice){
            $products->where('price','<',$kagenprice);
        }

        

        $product= $products->get();

        return $product;
      
    }
0

2Answer

初めまして。

①上限金額と下限金額の<と>が逆じゃないでしょうか?

②$jougenpriceに値があった場合、$kagenpriceに値が存在していても$jougenpriceの条件しか追加されないようなif文になっています。

1Like

Comments

  1. @ichihhd

    Questioner

    ご回答ありがとうございます。

    ご指摘いただいた二点を改善してみました。

        if($jougenprice){
    $products->where('price','<',$jougenprice);
    }

        if($kagenprice){
            $products->where('price','>',$kagenprice);
        }
    

    が状況は変わらず、価格の検索機能が反映されない状況です、、、

  2. でしたら、変数の中に想定した値がきちんと格納されているか・想定したSQLが発行されているか確認してみてもらえますか?

  3. @ichihhd

    Questioner

    知識が浅くて申し訳ございません。
    上記の二点はどのように確認すればよろしいでしょうか。

  4. @ichihhd

    Questioner

    ご丁寧にありがとうございます。
    試してみたのですが、値もsqlも問題ありませんでした、、、

products.price
にしたらどうですか?
joinしている箇所は確かですが明示しないとダメだった気が

1Like

Comments

  1. @ichihhd

    Questioner

    ご回答ありがとうございます。

    select欄にproducts.priceを追加したら機能いたしました。
    本当にありがとうございます。
    products.*にしていたのですべて選択されていると思っていたのですが、明示しないといけなかったのですね。

  2. おつ!

    追記
    すいません、よくコメント読んでなかったのですが、自分が言った箇所は

    'product_name', 'LIKE', "%$keyword%"
    

    のような記述を

    'products.product_name', 'LIKE', "%$keyword%"
    

    にしたらどうかという内容でした。
    言葉足らずですいません

    ただうまく動いているなら大丈夫ですー

    おつ!

Your answer might help someone💌