检查数据库中是否存在记录,发送电子邮件并重定向到Laravel 7.x中的输入令牌页面

问题描述

我是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',[App\Http\Controllers\CertificatesController::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';
    }
}

尽管我在数据库中有一条符合要求的记录,但我还是返回了“否”

[UPDATE 1]请注意,我必须使用所有三个输入进行验证的原因是,在某些培训中,一个cert_no可以具有两个cert_type。因此,需要检查DB中是否存在cert_no AND cert_type AND member_email。还请注意,我已经使用普通的PHP $ query完成了此工作,并且可以正常工作。

[UPDATE 2]我从上面的函数删除了-> where('cert_type','LIKE',$ cert_type),它工作正常。因此,现在它检查cert_no AND member_email是否存在。但是我也需要使用cert_type。我使用LIKE的原因是因为在cert_type下存储的数据是逗号分隔的数组。由于member_email字段是唯一的,因此同一电子邮件的两个记录不能存在,但是一个电子邮件可以具有多种证书。

[UPDATE 3]因此,它终于可以工作了。我非常感谢所有的努力和贡献。我错过了'%'号,所以我更改了代码形式

$certificate = Certificate::where('cert_no',$member_email)->get();

$certificate = Certificate::where('cert_no','%'.$cert_type.'%')->where('member_email',$member_email)->get();

解决方法

在laravel中,您已经具有执行此操作的验证。 检查一下。

https://laravel.com/docs/7.x/validation#rule-exists

存在时,您可以检查特定数据在数据库中是否可用。

,

这样对您有用吗?

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),然后查看来自前端的数据是否满足您的要求。

,

您可以使用以下代码检查有效查询

dump($certificate->toSql(),$certificate->getBindings());