#php #mysql #laravel #laravel-artisan
#php #mysql #laravel #laravel-artisan
Вопрос:
Я новичок в Laravel. Я создаю приложение, в котором люди, посещающие обучение, могут загружать свои электронные копии сертификатов. Это поток, которого я хочу достичь
-
Страница индекса отображает форму трех входных данных
- Номер сертификата (cert_no)
- Тип сертификата (cert_type)
- Электронная почта участника (member_email)
При отправке, если запись существует, отправьте электронное письмо, содержащее токен, и перенаправьте на следующую страницу, где вы указываете токен, отправленный на вашу электронную почту.
Теперь моя задача в том, как мне проверить базу данных, чтобы убедиться, что одна запись соответствует ВСЕМ требованиям?
Ниже приведена моя форма
<form method="POST" action="{{ route('checkExist') }}" enctype="multipart/form-data" data-form-validate="true" novalidate="novalidate">
@csrf
<div class="card bg-white shadow">
<div class="card-body pt-2">
<div class="input-group">
<label>Certificate No.</label>
<input type="text" name="cert_no" class="input input-md input-green input-block" value="{{ old('cert_no') }}" data-rule-required="true" data-msg-required="* Field cannot be empty" required>
</div>
<div class="input-group">
<label>Choose Type</label>
<select name="cert_type" class="input input-md input-green input-block" data-rule-required="true" data-msg-required="* Select an option" required>
@if ($errors->any())
<option value="{{ old('cert_type') }}">{{ old('cert_type') }}</option>
@endif
<option value="">---Select Option---</option>
<option value="Certificate 1">Certificate 1</option>
<option value="Certificate 2">Certificate 2</option>
</select>
</div>
<div class="input-group">
<label>Email</label>
<input type="email" name="member_email" class="input input-md input-green input-block" value="{{ old('member_email') }}" data-rule-required="true" data-msg-required="* Field cannot be empty" required>
</div>
<div class="input-group mt-1">
<input type="submit" class="btn btn-lg btn-cipm btn-block" value="Get Access">
</div>
</div>
</div>
</form>
Ниже приведен мой маршрут
Route::post('/certificate', [AppHttpControllersCertificatesController::class, 'checkExist'])->name('checkExist');
и ниже приведена моя функция
public function checkExist(Request $request)
{
$this->validate($request, [
'cert_no' => 'required',
'cert_type' => 'required',
'member_email' => 'required|email'
]);
$cert_no = $request->Input('cert_no');
$cert_type = $request->Input('cert_type');
$member_email = $request->Input('member_email');
$certificate = Certificate::where('cert_no', '=', $cert_no)->where('cert_type', 'LIKE', $cert_type)->where('member_email', '=', $member_email)->get();
if (count($certificate) > 0)
{
return 'Yes';
}
else
{
return 'No';
}
}
И я получаю ответ «Нет», хотя у меня есть запись в базе данных, которая соответствует требованиям
[ОБНОВЛЕНИЕ 1] Пожалуйста, обратите внимание, что причина, по которой я должен использовать все три входа для проверки, заключается в том, что на некоторых тренингах у одного cert_no может быть два cert_type. Следовательно, необходимо проверить, существуют ли cert_no И cert_type И member_email в БД. Также обратите внимание, что я выполнил это с помощью обычного PHP $ query, и это работает.
[ОБНОВЛЕНИЕ 2] Я удалил -> where(‘cert_type’, ‘LIKE’, $cert_type) из функции выше, и она работает нормально. Итак, прямо сейчас он проверяет, существует ли cert_no И member_email. Но мне также нужно использовать cert_type. И причина, по которой я использую LIKE, заключается в том, что данные, хранящиеся в cert_type, представляют собой массив, разделенный запятыми. Поскольку поле member_email уникально, две записи одного и того же электронного письма не могут существовать, но одно электронное письмо может иметь несколько типов сертификатов.
[ОБНОВЛЕНИЕ 3] Итак, это наконец работает. Я действительно ценю все усилия и вклад. Мне не хватало знака «%», поэтому я изменил форму кода
$certificate = Certificate::where('cert_no', '=', $cert_no)->where('cert_type', 'LIKE', $cert_type)->where('member_email', '=', $member_email)->get();
Для
$certificate = Certificate::where('cert_no', '=', $cert_no)->where('cert_type', 'LIKE', '%'.$cert_type.'%')->where('member_email', '=', $member_email)->get();
Комментарии:
1. Выполните dd($certificate); чтобы проверить содержимое, чтобы убедиться, что оно совпадает с вашей записью в таблице базы данных.
2. Да. Сделал это, когда у меня был -> where(‘cert_type’, ‘LIKE’, $cert_type) в функции, вернул пустой элемент[]. Но когда я удалил эту строку, она работает. Но мне нужно также проверить с помощью cert_type
Ответ №1:
В laravel у вас уже есть проверка для выполнения этого действия. Проверьте это.
https://laravel.com/docs/7.x/validation#rule-exists
С помощью exists вы можете проверить, доступны ли конкретные данные в базе данных или нет.
Ответ №2:
Работает ли что-то подобное для вас?
public function checkExist(Request $request)
{
$data = $request->validate([
'cert_no' => 'required',
'cert_type' => 'required',
'member_email' => 'required|email'
]);
$exists = Certificate::where($data)->exists();
if ($exists)
{
return 'Yes';
}
else
{
return 'No';
}
}
Если нет, dd($data)
и посмотрите, соответствуют ли данные, поступающие из интерфейса, вашим требованиям.
Комментарии:
1. Исправление: if ($exists), верно? Итак, я попробовал это, он по-прежнему возвращает «Нет». Использование dd возвращает входные значения как существующие в базе данных, даже если я выбираю неправильный cert_type.
2. Да, да, извините … ввел неправильно. Его
$exists
. Только что обновил его. Это очень странно. Можете ли вы выгрузить содержимое$data
и содержимое этой одной соответствующей строки в базе данных?
Ответ №3:
Вы можете использовать следующий код для проверки правильности запроса
dump($certificate->toSql(), $certificate->getBindings());
Комментарии:
1. Это вернуло ошибку Collection::toSql не существует