Yii2删除唯一验证器

时间:2016-09-29 14:00:21

标签: yii2

我有一个AR模型,它有以下规则:

    /**
     * @inheritdoc
     */
    public function rules() {
        return [
            [['category_id', 'source', 'url', 'title', 'thumbs', 'duration', 'status', 'created_at'], 'required'],
            [['category_id', 'status', 'views', 'ratings', 'created_at'], 'integer'],
            [['rating'], 'double'],
            [['source', 'url', 'title', 'slug'], 'string', 'max' => 255],
            [['url'], 'unique', 'on' => 'create'],
            [['category_id'], 'exist', 'skipOnError' => true, 'targetClass' => Category::className(), 'targetAttribute' => ['category_id' => 'id']],
        ];
    }

我想进行软删除,所以我有以下内容。

    /**
     * Deletes an existing Video model.
     * If deletion is successful, the browser will be redirected to the 'index' page.
     * @param integer $id
     * @return mixed
     */
    public function actionDelete($id)
    {
        $model = $this->findModel($id);
        $model->status = 0;
        //var_dump($model->validate());
        //var_dump($model->getErrors());die;
        $model->save();

        return $this->redirect(['index']);
    }

但不幸的是我无法改变模型的状态,因为验证说(已经采取了url xxxxxxx)所以我去了PostgreSql,我检查了记录,但不幸的是只有更新记录才有这个值!所以在我看来,Yii2独特的有效性是不好的。我想删除唯一的验证器,但似乎这是不可能的。因为我注释掉规则数组中的uniqure行,但它对我没有帮助。我重新启动机器,但我不知道,似乎Yii2想要始终检查网址是否独特。

1 个答案:

答案 0 :(得分:2)

您可以使用方案

public function scenarios()
{
    $scenarios = parent::scenarios();
    $scenarios['soft_delete'] = ['status',]; //Scenario Values Only Accepted
    return $scenarios;
}



public function actionDelete($id)
{
    $model = $this->findModel($id);
    $model->status = 0;
    $model->scenario = 'soft_delete';
    //var_dump($model->validate());
    //var_dump($model->getErrors());die;
    $model->save();

    return $this->redirect(['index']);
}

或其他方式是禁止对此操作进行验证

public function actionDelete($id)
{
    $model = $this->findModel($id);
    $model->status = 0;
    //var_dump($model->validate());
    //var_dump($model->getErrors());die;
    $model->save(false);

    return $this->redirect(['index']);
}