Yii-控制器-用于更改数据库上的标志/布尔值的函数


Yii - controller - function to change a flag/boolean on db

我正在和Yii一起做一个项目。我现在正在后台工作。我在控制器中实现了一个函数,该函数应该加载一个模型,更改数据库中该特定模型的值(从0变为1的tinyint),并重定向到另一个url。我希望以与CRUD生成器生成的"delete"函数相同的方式使用此函数。因此,在"删除"功能上激励自己,我正在尝试这个"接受"功能:

    public function actionAccept($id) {
    if(Yii::app()->request->isPostRequest)
    {
        $model = $this->loadModel($id);
        $model->testimonial_accepted = '1';
        $model->save();
        // if AJAX request we should not redirect the browser
        if(!isset($_GET['ajax']))
            $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
    }
    else
        throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
    }

我在一个视图中调用"accept"函数,如下所示:

     array('label'=>'Accept Client', 'url'=>'#', 'linkOptions'=>array('submit'=>array('accept','id'=>$model->id),'confirm'=>'Are you sure you want to accept this item?')),

运行时,没有错误。它加载了正确的模型,但不会更改数据库中的值(recommendation_accepted)。你知道为什么吗?我做错了什么?

提前感谢

苏皮亚里奥斯。

首先,检查这是否有效:

$model->save( false );

如果有效,这意味着由于验证失败,模型的数据不会被保存(例如,检查模型的规则并最终定义新的场景)。

在这种情况下,我认为使用更新而不是保存方法更合适:

$model->setAttribute( 'testimonial_accepted', 1 );
$model->update( array( 'testimonial_accepted' ) );

在您的链接中,路径应该是<controller>/<action>的形式,所以假设您的控制器名称是foo,那么您应该说:

array('submit'=>array('foo/accept','id'=>$model->id)

我同意@Boris的观点,你应该使用更新,而且数据操作代码最好在模型中遵循MVC最佳实践,所以它看起来像这样:

控制器:

        $model = $this->loadModel($id);
        $model->acceptTestimonial(); // a model function
        $this->redirect(array('action_you_choose'));

型号:

public function acceptTestimonial()
{
    $this->testimonial_accepted = '1';
    $this->update(array('testimonial_accepted'));
}