Validation Yii2如果数据库中已经存在记录,则在模型中添加规则

Validation Yii2如果数据库中已经存在记录,则在模型中添加规则,validation,yii2,yii2-advanced-app,Validation,Yii2,Yii2 Advanced App,我的问题是验证数据库中是否已经存在记录。所以我用yii2中的Gii生成器创建了一个官方表单。它包含名称、id、位置、fname、MNName、lname。如果管理员想要创建一个新数据,并且该数据已经存在,它将显示一条弹出消息“此数据已经存在”。 我怎样才能做到这一点?有什么想法吗 这是我的模型: class Name extends \yii\db\ActiveRecord { public static function tableName() { return 'name'; } p

我的问题是验证数据库中是否已经存在记录。所以我用yii2中的Gii生成器创建了一个官方表单。它包含名称、id、位置、fname、MNName、lname。如果管理员想要创建一个新数据,并且该数据已经存在,它将显示一条弹出消息“此数据已经存在”。 我怎样才能做到这一点?有什么想法吗

这是我的模型:

class Name extends \yii\db\ActiveRecord
{
public static function tableName()
{
    return 'name';
}
public function rules()
{
    return [
        [['position', 'fname', 'lname'], 'required'],
        [['position', 'fname', 'mname', 'lname'], 'string', 'max' => 50],


    ];
}
public function attributeLabels()
{
    return [
        'name_id' => 'Name ID',
        'position' => 'Position',
        'fname' => 'First Name',
        'mname' => 'Middle Name',
        'lname' => 'Last Name',
    ];
}
}
这是我的控制器:

   public function actionCreate()
{
    $model = new Name();

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['report/create', 'id' => $model->name_id]);
    } else {
        return $this->renderAjax('create', [
            'model' => $model,
        ]);
    }
}
这是我的表格:

<div class="name-form">
<?php yii\widgets\Pjax::begin(['id' => 'sign-up']) ?>
<?php $form = ActiveForm::begin(['id' => 'form-signup', 'options' => ['data-pjax' => true]]); ?>

<?= $form->field($model, 'position')->textInput(['maxlength' => true,'style'=>'width:500px','placeholder' => 'Enter a Position....']) ?>

<?= $form->field($model, 'fname')->textInput(['maxlength' => true,'style'=>'width:500px','placeholder' => 'Enter a First Name....']) ?>

<?= $form->field($model, 'mname')->textInput(['maxlength' => true,'style'=>'width:500px','placeholder' => 'Enter a Middle Name....']) ?>

<?= $form->field($model, 'lname')->textInput(['maxlength' => true,'style'=>'width:500px','placeholder' => 'Enter a Last Name....'    ]) ?>

    <div class="form-group">
      <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-success','style' => 'padding:10px 60px; width:100%;']) ?>
    </div>


<?php ActiveForm::end(); ?>
<?php yii\widgets\Pjax::end() ?>


所以我假设您想要一个唯一的验证器,您可以在您的模型中尝试:

public function rules()
{
    return [
        [['position', 'fname', 'lname'], 'required'],
        [['position', 'fname', 'mname', 'lname'], 'string', 'max' => 50],
        [['fname','lname'], 'unique', 'targetAttribute' => ['fname', 'lname'], 'message' => 'This data already exists']
    ];
}

上述规则将使
fname
lname
属性的组合唯一,您可以通过在验证规则中添加或删除字段名/属性来修改要唯一的属性或属性组合。

您可以创建自定义验证,采用任意属性名称并定义规则:

 public function rules()
    {   
      return [
          [['position', 'fname', 'lname'], 'required'],
          [['position', 'fname', 'mname', 'lname'], 'string', 'max' => 50],
          [['position', 'fname', 'lname'], 'checkUniq'], //add this line
      ];
    }
->模型中的自定义函数:

public function checkUniq($attribute, $params)
{
    $user = self::find()->where(['fname'=>$this->fname,'lname'=>$this->lname,'position'=>$this->position])->one();
    if (isset($user) && $user!=null)
        $this->addError($attribute, 'User already added.');
}

非常感谢。但是如果管理员想输入相同的名字,但不同的姓氏呢。例如,数据库中的数据是testposition、testfirstname、testlastname。管理员希望键入相同的职位和姓氏,但姓氏不同。我试过你的代码,但它似乎验证了fname和lname。所以你也想验证
position
?正如我前面提到的,您可以将
position
添加到属性验证中,比如
[['position'、'fname'、'lname']、'unique']
。不,只添加fname和lname。