#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».