1

従業員コードに一意の検証を適用しました。Add Empケースでは問題なく動作しています。しかし、更新の場合に機能しない理由がわかりません。これに使用したコードは次のとおりです。

私のルールメソッドは次のとおりです。

public function rules()
{

    return array(
        array('is_active', 'numerical', 'integerOnly'=>true),
        array('first_name, last_name, employee_code, username, password, role,joining_date,', 'required','on'=>array('create','update')),   

        array('employee_code', 'numerical', 'integerOnly'=>true),

        array('employee_code', 'unique','on'=>array('create','update')),
        array('employee_code', 'length', 'min' => 4, 'max'=>4, 'message'=>Yii::t("translation", "{attribute} is too short.")),
        array('username','email'),      
        array('username','valid_username','on'=>array('create')),
        array('username', 'required','on'=>array('forgotPassword')),

        array('currentPassword, newPassword, newPasswordRepeat', 'required','on'=>array('change')),
        array('newPassword', 'compare', 'compareAttribute'=>'newPasswordRepeat','on'=>array('change'),'message'=>'New and Confirm Password do not match.'),
        array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements(),'on'=>array('forgotPassword')),
        array('joining_date', 'safe'),
        array('years', 'safe'),
        array('user_id, first_name, last_name, employee_code, username, password, role, joining_date, pending_regular_leave, pending_medical_leave, allocated_regular_leave, allocated_medical_leave, is_active', 'safe', 'on'=>'search'),
    );

誰かが私が間違っている場所を特定できますか。私を助けてください。

4

2 に答える 2

0

レコードを更新すると、データベースに既に存在し、検証しようとしている値も既に存在します。これが、更新を行うときに、更新しようとしているレコードをチェックから除外する必要がある理由です。それ以外の場合、チェックは次のようなメッセージで失敗します

従業員コード「何らかの値」は既に取得されています。

例 (条件付きの新しいルール)

array(
    'employee_code',
    'unique',
    'criteria' => array(
        'condition' => 'user_id != :id',
        'params' => array(':id' => $this->user_id),
    ),
    'on' => array('create', 'update'),
),

それuser_idが主キーだと思います。

正式には、シナリオについて追加のチェックが必要ないため、updateとについて異なるシナリオを用意することをお勧めします。単一のシナリオも同様に機能しますが、このようなことをしたいかもしれませんcreatecreate

array(
    'employee_code',
    'unique',
    'on' => array('create'),
),
array(
    'employee_code',
    'unique',
    'criteria' => array(
        'condition' => 'user_id != :id',
        'params' => array(':id' => $this->user_id),
    ),
    'on' => array('update'),
),

PSコメントの1つで述べたようにinsertcreateデフォルトでは新しく作成されたモデルのシナリオはinsert. これは、より一般的に使用される名前です。

于 2016-04-06T06:37:55.370 に答える