Поиск в Laravel не работает. похоже, что эта часть не работает «-> where(‘forms.Doc_Desc’,’LIKE’,’%’.$query.’%’) «

#laravel

#laravel

Вопрос:

Я пытаюсь создать окно поиска. Объединенные 5 таблиц, работают правильно в моем индексе.

Это моя функция поиска

 public function search(Request $request) {
    $query = $request['query'];
    $Rates =  DB::table('rates')
        ->join('forms', 'forms.id' ,'=', 'rates.FormID') 
        ->join('documents', 'documents.FormID', '=', 'rates.formID')
        ->join('contractors', 'contractors.user_id', '=', 'rates.contractor_id')        
        ->join('countries', 'countries.ID', '=', 'forms.country')->orwhere('documents.Status', '=', '2')->orwhere('documents.Status', '=', '4')->where('forms.Doc_Desc','LIKE','%'.$query.'%')   
        ->get(['rates.Class', 'rates.Rate', 'rates.Rate2','forms.Doc_Desc','documents.FileName', 'documents.Status', 'countries.country', 'contractors.contractor_name'])->groupBy('Doc_Desc')->map(function ($Rate, $key) { return $Rate;});
 
     if (count($Rates) > 0)   {
      return view('admin.rates',[
        'Rates' => $Rates,
      ]);
     }
     else {
      return back()->withInput()->with('status','No Luck');
     }
   }
  

Это мое мнение

  @foreach( $Rates as $Rate=>$ID)
     <tr>
        <td> 
            @foreach($ID as $IDs)  
                {{$IDs->contractor_name }} 
                @break 
            @endforeach 
        </td>
                                            
        <td> {{ $Rate}} </td> 
        <td> 
            @foreach($ID as $IDs)   
                @if ($IDs->Class == 'Metro') 
                    {{$IDs->Rate }}   {{$IDs->Rate2 }}
                    <small class="text-warning">*</small>   
                    @break  
                @endif   
            @endforeach
        </td>
        <td> 
            @foreach($ID as $IDs)   
                  @if ($IDs->Class == 'Regional') {{$IDs->Rate }}    {{$IDs->Rate2 }}<small class="text-warning">*</small> 
                  @break 
                  @endif  
                                                                      
             @endforeach
         </td>
         <td> 
             @foreach($ID as $IDs)  
                 @if ($IDs->Class == 'Remote') {{$IDs->Rate }}   {{$IDs->Rate2 }}<small class="text-warning">*</small>  
                 @break   
                 @endif  
             @endforeach
          </td>   
          <td> 
          @foreach($ID as $IDs)  
              @if ($IDs->Class != 'Metro' amp;amp; $IDs->Class != 'Regional' amp;amp; $IDs->Class != 'Remote') <span class="badge badge-secondary">  {{$IDs->Class }}  </span>  
              @endif  
          @endforeach     
         </td>   
  

У меня созданы два разных маршрута (один для простого просмотра, а другой для поиска (с разными URI)
это действительно грязно. я новичок и надеюсь, что кто-нибудь может помочь. Спасибо!

также добавил это над моей таблицей @if(isset($Rates))

Комментарии:

1. вам лучше использовать модели вместо создания функций объединения

Ответ №1:

Проблема в том, как вы используете свои where orwhere предложения and:

 ->orwhere('documents.Status', '=', '2')
->orwhere('documents.Status', '=', '4')
->where('forms.Doc_Desc','LIKE','%'.$query.'%') 
  

Если одно из них равно true, оно вернет вам результат без его фильтрации, так, например, если ваш статус равен 2, то независимо от вашей $query переменной результат будет возвращен.

Что вам нужно сделать, так это инкапсулировать 2 orwhere предложения в одно where предложение и оставить фильтрацию where отдельно или для вашего примера просто использовать whereIn .

Например:

  ->where('forms.Doc_Desc','LIKE','%'.$query.'%') 
 ->where(function ($q) {
           $q->where('documents.Status', '=', '2')
             ->orwhere('documents.Status', '=', '4')
            
    })
  

Или даже проще, что будет работать для вашего кода

  ->whereIn('documents.Status',[2,4])
 ->where('forms.Doc_Desc','LIKE','%'.$query.'%')