检查数据库中是否存在记录,发送电子邮件并重定向到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', [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 AND cert_type AND member_email。还要注意的是,我已经使用普通的PHP$查询完成了这项工作,并且它是有效的。

[更新2]我删除了->其中('cert_type','LIKE',$cert_type(,它可以正常工作。所以现在它检查cert_no AND 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();

在laravel中,您已经有了执行此操作的validatio。签出这个。

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());

最新更新