我有一个yii应用程序。数据已正确验证。 $model->validate()
返回true但未保存数据。有什么方法我知道错误。它什么都不做。既不打印错误也不打印任何警告。
if (isset($_POST['Invoice'])) {
$model->validate();
$model->attributes = $_POST['Invoice'];
if (!$model->validate()) {
die(CVarDumper::dump($model->errors,10,true));
}
if ($model->save()) {
die("Data saved");
$this->redirect(array('view', 'id' => $model->id));
} else {
CVarDumper::dump($model->attributes,10,true);
CVarDumper::dump($model->errors,10,true);
}
}
答案 0 :(得分:9)
如果您在模型中覆盖beforeSave
或afterFind
方法,
public function beforeSave() {
return true; //don't forget this
}
public function afterFind() {
return true; //don't forget this
}
确保返回true 这些功能
答案 1 :(得分:6)
如果save()返回true并且数据库和查询中没有错误。唯一可能的是,你没有通过“$ model-> attributes”标记一些可以进行质量分配的列。
确保您尝试保存的列在模型的“规则”功能中标记为安全。您可以通过在模型中的“规则”功能中添加以下规则来标记列安全。
array ( "column_name1, column_name2 ....." , "safe" )
答案 2 :(得分:5)
我刚刚遇到类似的事情。一切都正确验证,$ model-> save()返回true,但没有数据保存在数据库中。
问题和解决方案是我正在创建$ model对象:
$model = ClassName::model();
但你需要像这样创建对象:
$model = new ClassName;
答案 3 :(得分:5)
如果您遇到此问题,请将其替换为:
$model->save(false)
这解决了您的问题。
如果您使用$model->save();
过滤器正在运行,那对您不利。
答案 4 :(得分:1)
启动一些logging,看看发生了什么......
答案 5 :(得分:0)
如果我没有错,您正在save()
方法中执行AR $model->save()
。您没有收到任何错误,但数据也未保存。
如果是这种情况,你想做一个:
die(CVarDumper::dump($arObj->errors,10,true));
$arObj->save();
致电后的。大多数情况下,这是因为数据库拒绝为插入或更新提供的值。
答案 6 :(得分:0)
我遇到了同样的问题,我的错误在于控制器中的帖子名称,我用$model->save
。我错了 - if(isset($_POST['postname']))
答案 7 :(得分:0)
当我使用reCaptcha时,我遇到了同样的错误。我刚刚做了这件事并且有效:
$model->scenario = NULL;
确保在验证后执行此操作。
答案 8 :(得分:0)
不要覆盖您的模型构造函数:
function __construct() { } // don't do this
答案 9 :(得分:0)
我的问题是我在ActiveRecord类中有一个列名属性,所以它没有保存。
你不应该声明列名的属性,因为我猜魔术方法__get()
和__set()
用于保存数据,我想通过检查单击{{1时是否有列更改避免无用的SQL查询的方法。就我而言,因为该列是用户声明的属性,所以它不在列列表中,因此未检测到对它的更改。
希望这有助于其他人