Строка поиска, содержащая только символы в моем поиске

#laravel

#laravel

Вопрос:

В моей строке поиска я хотел бы ограничить свой запрос, например: цифрами или символами, и сохранить только символы в моем поиске. Пользователь может ввести только имя в запросе.

Я застрял в своей функции…

 public function index(Request $req){

     if($req->search == ""){
            $students = Student::paginate(5);
           return view('admin.students.index', compact('students'));
     } else {
          $students = Student::where('nom', 'LIKE', '%' .$req->search . '%')
        ->paginate(5);
        $students->appends($req->only('search'));
        return view('admin.students.index', compact('students'));
     }  

    }
  

Большое вам спасибо за вашу помощь.

Ответ №1:

Вы можете добавить проверку, чтобы в ней были только alpha символы:

 public function index(Request $req)
{
    if ($req->has('search') amp;amp; !empty($req->search)) {
        // validate here
        $validated = $req->validate([
            'search' => 'alpha', // must be entirely alphabetic characters
        ]);

        $students = Student::where('nom', 'LIKE', '%' . $validated['search'] . '%')->paginate(5);
        $students->appends($req->only('search'));
        return view('admin.students.index', compact('students'));
    }

    $students = Student::paginate(5);
    return view('admin.students.index', compact('students'));
}
  

Если проверка завершится неудачей, она немедленно перенаправит обратно с сообщениями об ошибках, которые вам необходимо отобразить.


Источник: https://laravel.com/docs/5.8/validation#rule-alpha

альфа
Поле для проверки должно состоять полностью из буквенных символов.

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

1. У меня сообщение об ошибке Undefined variable: request . Эта строка не подходит? $validated = $request->validate([ 'search' => 'alpha', ]);

2. Да, извините, по умолчанию это $ request, вы используете $ req. Обновил мой ответ. 🙂

3. У меня есть Undefined index: search но ваш старый код был в порядке … 🙂

4. Мой пример кода показывает один способ сделать это, и оба ответа ссылаются на страницы руководства по проверке Laravel.

5. Видеть: laravel.com/docs/5.8/validation#working-with-error-messages

Ответ №2:

HTML5

Сначала защитите свое поле, чтобы дать пользователю немедленную обратную связь с пользователем. В вашем блейде формы:

 <input type="text" name="search" value="{{ isset($search) ? $search : '' }}" pattern="[a-zA-Z] " placeholder="search" />
  

Проверка

подтвердите, что строка поиска является буквенно-цифровой:

 $this->validate($reqest,[
    'search' => 'alpha_num',
]);
  

или просто альфа:

 $this->validate($request,[
    'search' => 'alpha',
]);
  

Более новые версии

В более новых версиях (5.6 ) запросы могут проверять себя вместо контроллера и возвращать проверенные поля для большей защиты, поэтому то же самое будет выглядеть следующим образом:

 $data = $request->validate([
    'search'=>'alpha',
]);
  

Отображаются ошибки проверки

Берем приведенный выше ввод HTML5 и добавляем к нему код для отображения ошибок проверки, чтобы мы могли видеть, когда возникает ошибка. Мы получаем форму , которая выглядит следующим образом:

 <form method="get" action="{{route('student.index')}}">
    <input type="text" name="search" value="{{ isset($search) ? $search : '' }}" pattern="[a-zA-Z] " placeholder="search" />
    @if ($errors->has('search'))
        <div class="error">{{ $errors->first('search') }}</div>
    @endif
    <input type="submit" />
</form>
  

Собираем это вместе

Применяя это к вашему коду:

 public function index(Request $request)
{
    $data = $request->validate([
        'search' => 'alpha',
    ]);
    $students = isset($data['search']) ? Student::where('nom','like','%' . $data['search'] . '%')->paginate(5) : Student::paginate(5);
    return view('admin.students.index', compact('students','search'));
}
  

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

1. Большое вам спасибо за вашу помощь… Я просто копирую / вставляю вашу функцию, когда я выполняю поиск, ничего не происходит… 🙁 Я забыл несколько вещей?

2. Что именно означает «ничего не происходит»? Вы имеете в виду, что страница отправляется, но ничего не меняется?

3. Итак, вы получаете обратно пустую таблицу? Я внес небольшое изменение в ответ, которое должно исправить это, если это была проблема с моим ответом.

4. И еще один, чтобы сделать функцию короче, поскольку условие больше не требуется.

5. Имейте в виду, что like чувствителен к регистру. таким образом, поиск «Sam» не приведет к поиску «sam».