2016-04-22 11:41:24 4997次浏览 2条回答 1 悬赏 50 金钱

在用$model->dirtyAttributes的时候。遇到一个很奇怪的问题,以user表为例,如果在Models中rules里面定义 [['status'],'integer'] 不管status的值是否改变,打印$model->dirtyAttributes都会Array([status] => 10),如果去掉[['status'],'integer'],不管status的值是否改变,打印$model->dirtyAttributes都会为空。
这个如何判断我提交的数据是否变化。

http://www.yiichina.com/question/1785

最佳答案

  • bryson 发布于 2016-04-22 12:29 举报

    DirtyAttributes :

    大概定義 => 顯現汙染的屬性

    假使是 INSERT 狀態 dirtyAttributes 都應當出現填入的欄位值

    以下提出 UPDATE 狀態

    假使我 $model = User::findOne('2');	//抓取 User表中第二筆的資料
    var_dump($model->status);	//如果 int(2)
    範例一 : 
    	$model->status = 3;
    	if(empty($model->dirtyAttributes)){
    		echo "數據無變化";
    	}else{
    		echo "數據變化";
    	}
    
    	Ans :: "數據變化"
    
    範例二 : 
    	$model->status = 2;
    	if(empty($model->dirtyAttributes)){
    		echo "數據無變化";
    	}else{
    		echo "數據變化";
    	}
    
    	Ans :: "數據無變化"
    

    參考文獻 :
    En :
    http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#dirty-attributes

    Cn :
    http://www.yiichina.com/doc/guide/2.0/db-active-record

    4 条回复
    回复于 2016-04-22 13:21 回复
    if ( Yii::$app->request->isPost ) {
            //$model->status = 0;
                if ($model->load(Yii::$app->request->post())) {
    
                    if(empty($model->dirtyAttributes)){
                        echo "數據無變化";
                    }else{
                        echo "數據變化";
                    }
                }
    }
    

    数据变化

    if ( Yii::$app->request->isPost ) {
        //$model->status = 0;
        //if ($model->load(Yii::$app->request->post())) {
    
        if(empty($model->dirtyAttributes)){
            echo "數據無變化";
        }else{
            echo "數據變化";
        }
    //}
    

    数据无变化

    问题出在$model->load(Yii::$app->request->post())

    回复于 2016-04-22 14:19 回复

    那解決了?
    我上述是提供方案是了解 dirtyAttributesINSERT , UPDATE 差異

    像是 Insert

    public function actionInsert()
    {
        $model = new User ();
        $model->load(Yii::$app->request->post());
    }
    

    像是 Update

    public function actionUpdate($id = NULL)
    {
        $model = User::findOne($id);
        $model->load(Yii::$app->request->post());
    }
    

    對 dirtyAttributes 行為上就是有更動的值會秀出
    但這是你在 dirtyAttributes 之前該確定的

    回复于 2016-04-22 14:31 回复

    真正原因是 dirtyAttributes 这个校验的是 === 。而input 输入框 status 的post提交上去的是字符串类型,而我的数据库类型是int类型。故被判断有变化,我只能在post上来的值强制转换为int类型,才能通过dirtyAttributes。

    回复于 2016-04-22 14:37 回复

    恩恩了解 , 因為我自己測試時有轉型別... 所以沒補上

  • 回答于 2019-01-16 18:21 举报

    $model->dirtyAttributes使用的是全等(===)校验,数据库查出来的都是string类型

您需要登录后才可以回答。登录 | 立即注册
acking
总监

acking 上海

注册时间:2012-05-16
最后登录:1天前
在线时长:65小时39分
  • 粉丝13
  • 金钱2555
  • 威望0
  • 积分3205

热门问题