【问题标题】:yii 1.1 save $models in foreach, nothing happensyii 1.1 在 foreach 中保存 $models,没有任何反应
【发布时间】:2018-01-14 17:21:23
【问题描述】:

找到所有这样的模型:

$models=Termin::model()->findAll(
            array("condition"=>"status = 3"));

然后使用 foreach 设置新状态:

foreach($models as $data) {

            $data->status=1;
            if($data->save())
            {
                echo 'saved';
            }
        }

但是什么也没发生;(

【问题讨论】:

    标签: foreach yii save


    【解决方案1】:

    更正: 从 Yii 1.1 开始,你可以使用save() 进行更新和保存操作。 CActiveRecord(您的模型的父类)自动确定当前模型(在您的情况下为 $data)是新记录还是从数据库中检索到的(带有 $data->isNewRecord 属性)。如果记录是新的,CActiveRecord 类将自动使用insert() 方法,如果它是从现有记录集中检索到的,它将切换到update()

    你的问题: save() 方法(来自CActiveRecord 父类)有两个可选参数。一个在实际发送到数据库处理程序进行保存之前运行验证(如您的模型规则中设置的那样),另一个用于指定要保存的属性。默认情况下,此验证设置为 true - 意思是:普通的 $data->save() 方法将运行您的所有模型级别验证。如果验证失败,则不会尝试写入记录,而是将错误详细信息添加到模型中。您可以通过在模型上调用 $data->getErrors() 方法来获取这些错误。 (注意getErrors() 来自另一个父类CModel

    如果您调用$data->save(false),模型验证[在模型的rules() 中定义] 将不会运行,记录将被传递给数据库处理程序以进行写入。这将返回成功(或异常,如果数据库级别有任何错误 - 例如外键/唯一/其他)。

    因此,我将重构您的代码如下:

    foreach($models as $data) {
        $data->status=1;
    
        try { // try catch block to capture db level mishaps
    
            if ($data->save(true)) { // run model validations and if success
    
                echo 'saved';
    
            } else { // model validations failed
    
                // Debug with var_dump($data->getErrors()) or Yii's CVarDumper class
                // And/Or Display error message to user
    
            }
    
        } catch (CException $ex) { // This will catch any errors thrown during db write
    
           // Debug with var_dump($ex)
           // And/Or Display error message to user
    
        }
    }
    

    【讨论】:

      【解决方案2】:

      我自己找到了解决方案。

      在 yii 1.1 中它的 update() 而不是 save()。在 yii 2 中,你总是可以使用 save() 我想!

      【讨论】:

      • 您可以使用 save() 代替 update()。在您的情况下,可能 save() 由于某些验证错误而失败并返回 FALSE。您可以使用 $data->getErrors() 获取更多信息
      • 并且很可能 save(false) 将起作用,并且它会跳过验证。但是我发现修复验证问题通常是更好的选择(例如场景)
      猜你喜欢
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      相关资源
      最近更新 更多