#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.'%')