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_2email_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(),这将删除重复项。比较原始长度与去重长度将显示是否存在重复项。