#laravel
Вопрос:
Я создал многоформный поиск в laravel, и он не работает должным образом
У меня есть имя таблицы candidates
и есть строка с именем salary
, в которой она имеет значение, как показано на рисунке ниже от 1 lac(s)
до 39 lac(s)
Это означает, что он работает неправильно, если я выполняю поиск min salary = 0
, и max salary = 4
он показывает данные между 0
4
, но он также показывает такие данные, как 10
18
22
код контроллера
public function advance(Request $request)
{
$data = DB::table('candidates');
if( $request->name){
$data = $data->where('name', 'LIKE', "%" . $request->name . "%");
}
if( $request->location){
$data = $data->where('location', 'LIKE', "%" . $request->location . "%");
}
if( $request->key_skills){
$data = $data->where('key_skills', 'LIKE', "%" . $request->key_skills . "%");
}
if( $request->gender){
$data = $data->where('gender', 'LIKE', "%" . $request->gender . "%");
}
if( $request->pref_loc){
$data = $data->where('pref_loc', 'LIKE', "%" . $request->pref_loc . "%");
}
if( $request->phoneno){
$data = $data->where('phoneno', 'LIKE', "%" . $request->phoneno . "%");
}
if( $request->email){
$data = $data->where('email', 'LIKE', "%" . $request->email . "%");
}
$min_ctc = $request->min_ctc;
$max_ctc = $request->max_ctc;
if ($min_ctc || $max_ctc) {
$data = $data->where('salary', '>=', $min_ctc);
$data = $data->where('salary','<=',$max_ctc);
}
$data = $data->paginate(10);
$data2 = $data->total();
return view('search', compact('data2'))->with('data',$data);
}
Заранее спасибо
Комментарии:
1. Если
min salary = 0
переводится вsalary > 0
, очевидно, что возвращаются строки для любой зарплаты, превышающей 0. Вы проверили сгенерированный запрос, чтобы узнать, связаны ли условия с помощьюOR
илиAND
?2. Кроме того, если этот столбец содержит текст (например:
5.50 Lac(s)
, вам следует выполнить текстовый поиск. Есть ли какая-либо веская причина не хранить зарплату в виде числа?3. Я не думаю, что вы получите требуемый результат, так как вы сохранили
strings
, а неintegers
Ответ №1:
Вы пытаетесь выполнить поиск по строке, а не по целому числу. Чтобы получить требуемый результат, вам нужно ввести приведение строки к целочисленному или плавающему значению, а затем выполнить операцию.
Вот сценарий, который может вам помочь.
if ($min_ctc || $max_ctc) {
$data = $data->whereRaw("CONVERT(SUBSTRING_INDEX(salary,' ', 1),UNSIGNED INTEGER) >= {$min_ctc}");
$data = $data->whereRaw("CONVERT(SUBSTRING_INDEX(salary,' ', 1),UNSIGNED INTEGER) <= {$max_ctc}");
}