Laravel 8 在创建和更新时通过列和行验证唯一性
Laravel 8 validate unique through columns and rows on create and update
我的 table email_1、email_2、email_3 中有 3 列。如何在创建和更新时避免行之间的重复?
对于更新方法,我可以这样按列进行验证:
public function rules()
{
/** OTHER VALIDATION RULES */
'email_1' => [
'required',
'email',
'unique:users,email_1,' . $this->id,
],
'email_2' => [
'required',
'email',
'unique:users,email_2,' . $this->id,
],
'email_3' => [
'required',
'email',
'unique:users,email_3,' . $this->id,
]
/** OTHER VALIDATION RULES */
}
问题是避免在我的表单的三个输入字段中使用相同的电子邮件地址?
您可以在 email_2 和 email_3 上使用 different
规则来确保所有 3 个值都不同。
public function rules(){
/** OTHER VALIDATION RULES */
'email_1' => [
'required',
'email',
'unique:users,email,' . $this->id,
],
'email_2' => [
'required',
'email',
'unique:users,email_2,' . $this->id,
'different:email_1',
],
'email_3' => [
'required',
'email',
'unique:users,email_3,' . $this->id,
'different:email_2',
],
/** OTHER VALIDATION RULES */
}
方法一
最简单的方法是使用 different
验证规则。像这样:
'email_1' => [
'required',
'email',
'different:email_2'
'different:email_3',
'unique:users,email,' . $this->id,
],
'email_2' => [
'required',
'email',
'different:email_1'
'different:email_3',
'unique:users,email_2,' . $this->id,
],
'email_3' => [
'required',
'email',
'different:email_1'
'different:email_2',
'unique:users,email_3,' . $this->id,
],
方法二
我看到您在 Request
class 内进行验证,这很好,因为您可以使用 After Hooks.
public function withValidator($validator)
{
$emails = [Request['email_1'], Request['email_2'], Request['email_3']];
$validator->after(function ($validator) use ($emails) {
if (count($emails) == count(array_unique($emails))) {
// Add error to message bag.
$validator->errors()->add('key', 'message');
}
});
}
以上示例使用 array_unique()
,这将删除重复项。比较原始长度与去重长度将显示是否存在重复项。
我的 table email_1、email_2、email_3 中有 3 列。如何在创建和更新时避免行之间的重复?
对于更新方法,我可以这样按列进行验证:
public function rules()
{
/** OTHER VALIDATION RULES */
'email_1' => [
'required',
'email',
'unique:users,email_1,' . $this->id,
],
'email_2' => [
'required',
'email',
'unique:users,email_2,' . $this->id,
],
'email_3' => [
'required',
'email',
'unique:users,email_3,' . $this->id,
]
/** OTHER VALIDATION RULES */
}
问题是避免在我的表单的三个输入字段中使用相同的电子邮件地址?
您可以在 email_2 和 email_3 上使用 different
规则来确保所有 3 个值都不同。
public function rules(){
/** OTHER VALIDATION RULES */
'email_1' => [
'required',
'email',
'unique:users,email,' . $this->id,
],
'email_2' => [
'required',
'email',
'unique:users,email_2,' . $this->id,
'different:email_1',
],
'email_3' => [
'required',
'email',
'unique:users,email_3,' . $this->id,
'different:email_2',
],
/** OTHER VALIDATION RULES */
}
方法一
最简单的方法是使用 different
验证规则。像这样:
'email_1' => [
'required',
'email',
'different:email_2'
'different:email_3',
'unique:users,email,' . $this->id,
],
'email_2' => [
'required',
'email',
'different:email_1'
'different:email_3',
'unique:users,email_2,' . $this->id,
],
'email_3' => [
'required',
'email',
'different:email_1'
'different:email_2',
'unique:users,email_3,' . $this->id,
],
方法二
我看到您在 Request
class 内进行验证,这很好,因为您可以使用 After Hooks.
public function withValidator($validator)
{
$emails = [Request['email_1'], Request['email_2'], Request['email_3']];
$validator->after(function ($validator) use ($emails) {
if (count($emails) == count(array_unique($emails))) {
// Add error to message bag.
$validator->errors()->add('key', 'message');
}
});
}
以上示例使用 array_unique()
,这将删除重复项。比较原始长度与去重长度将显示是否存在重复项。