我在我的控制器的actionCreate中有这个代码,它是通过Ajax调用的:
if ($model->save() === true)
{
echo CJSON::encode(array('id' => $model->id);
Yii::app()->end();
}
这会将{" id":null}返回到我的对话框,并且数据库中没有创建任何记录,Yii也没有记录任何内容。这已经工作了很长时间,我无法看到我在git日志中打破它所做的任何事情。什么可能导致这种情况?
答案 0 :(得分:3)
我在发布后不久就自己解决了..!
我在模型中添加了自己的构造函数,但忘了在最后调用父构造函数。 isNewRecord属性的默认值为false,但在未运行的构造函数中设置为true,因为我忘记了调用它。这意味着它尝试在save()中运行UPDATE而不是INSERT。所以我只是将调用添加到父构造函数...
public function __construct($scenario = 'insert')
{
//some stuff
parent::__construct($scenario);
}
不要忘记$场景,这很重要......:P
有人可能会争辩说,如果UPDATE语句不影响任何行,Yii应该做某事......:/
答案 1 :(得分:2)
您是否在模型中使用beforeSave
?然后确保它返回其父级的beforeSave
:
return parent::beforeSave();
答案 2 :(得分:2)
我知道你的问题已经解决,但我认为可以做得更好。
如果方案是插入
,则以这种方式初始化$ model$model = new Type;
如果方案被读取,更新或删除
,则以这种方式初始化$ model$model = Type::model()->findByPk($id);
我有同样的问题,我意识到我做错了什么
$model = Type::model(); /* this is wrong */
答案 3 :(得分:0)
$model->id
可能尚未使用save()
填充新ID。
改为使用$model->primaryKey
。
答案 4 :(得分:0)
另一个难以理解的原因可能是没有承诺的公开交易。我遇到了这样一个问题:代码运行的前一阶段的一个开放事务不已提交,导致一旦请求处理完成就会恢复对数据库的所有更改(成功与否 - 没有提交隐含回滚)。
哎呀,即使数据库日志文件显示所有'插入'正确。只有当我在日志中看到“开始交易”时...我已经开始怀疑,只是为了在调试和观察代码流程时确认我的怀疑。