将唯一规则设置为 yii2 rest 更新操作的字段

Set unique rule to a field on update action on yii2 rest

我正在用 yii2 创建一个 rest api 来创建和更新用户信息。下面是模型中的规则函数 class.

public function rules()
    {
        return [
            [['name', 'emailId', 'contactNumber'], 'required'],
            [['name', 'emailId', 'contactNumber'], 'string', 'max' => 255]
            [['emailId', 'username', 'contactNumber'], 'unique'],
            ['status', 'default', 'value' => self::STATUS_ACTIVE],
            ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]]
        ];
    }

这里我提到了emailIdusernamecontactNumber字段应该是唯一的。当我尝试创建时,它正在检查该字段是否唯一。如果唯一,则抛出错误,否则将保存。那也行。

但是当我尝试在那里更新值时,它还会检查该字段的特定值是否唯一。但它不应该是那样的。 unique 验证不应在 update action 上运行。所以我用 'on'=>'update' 更新了规则,就像 Yii 1 一样。检查以下功能。

public function rules()
    {
        return [
            [['name', 'emailId', 'contactNumber'], 'required'],
            [['name', 'emailId', 'contactNumber'], 'string', 'max' => 255]
            [['emailId', 'username', 'contactNumber'], 'unique', 'on'=>'update'],
            ['status', 'default', 'value' => self::STATUS_ACTIVE],
            ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]]
        ];
    }

但是当我检查 official documentation 时,没有像 on 这样的选项来检查特定的 action。当我使用 'on'=>'update' 时,这两个(在创建和更新时)地方都没有验证。可能是因为 on。就这样吧。我需要为 create action 中的那些字段添加 unique 验证,而不是 update action.

所以,请任何人帮助我如何仅在创建操作中向这些字段添加唯一验证。

谢谢。

您可以在 ActiveController 中为您的 REST 操作设置场景:

public function actions()
    {
        $actions = parent::actions();
        $actions['update']['scenario'] = 'update';
        $actions['create']['scenario'] = 'create';
        return $actions;
    }

然后在规则中使用它:

[['emailId', 'username', 'contactNumber'], 'unique', 'on'=>'create']

您还必须为特定模型中的每个场景指定活动属性列表 class:

public function scenarios()
    {
        $scenarios = parent::scenarios();
        $scenarios['update'] = ['type', 'title', 'description'];
        $scenarios['create'] = ['type', 'title', 'description', 'affiliate_id'];
        return $scenarios;
    }