Предварительный поиск Laravel

#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}");
     }