Проверьте, существуют ли записи в базе данных, отправьте электронное письмо и перенаправьте на страницу ввода токена в Laravel 7.x

#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 не существует