2014-01-31 56 views
0

我有我的控制器actionCreate这段代码是通过Ajax调用:

if ($model->save() === true) 
{ 
    echo CJSON::encode(array('id' => $model->id); 
    Yii::app()->end(); 
} 

这将返回{ “ID”:空}到我的对话框中,并且在数据库中没有创建任何记录,并且Yii没有记录任何记录。这已经工作了很长时间,我看不到任何我曾经做过的在git日志中打破它。什么会造成这种情况?

+0

您是否在代码中使用了事务? –

+0

你可以发布你的模型代码吗? –

+0

尝试使用'if($ model-> save){} else {print_r($ model-> getErrors());}' –

回答

3

我在发帖后不久就自己解决了。

我在模型中添加了自己的构造函数,但忘记在最后调用父构造函数。 isNewRecord属性的默认值为false,但在没有运行的构造函数中设置为true,因为我忘记了调用它。这意味着它试图在save()中运行UPDATE而不是INSERT。所以我只是添加了调用父类的构造...

public function __construct($scenario = 'insert') 
{ 
    //some stuff 
    parent::__construct($scenario); 
} 

不要忘记$情况下,重要的是...:P

有人可能会说的Yii应该做的事情,如果UPDATE语句不会影响任何行,但... .../

0

$model->id可能尚未使用新ID填充save()

改为使用$model->primaryKey

2

在模型中使用beforeSave吗?然后确保它返回它的beforeSave的父:

return parent::beforeSave(); 
1

我知道你的问题就解决了,但我认为这是可以做到更好。

初始化$模型这样,如果该方案是插入

$model = new Type; 

初始化$模型这样,如果该方案被读取,更新或删除

$model = Type::model()->findByPk($id); 

我有同样的问题,我意识到我做错了什么事是

$model = Type::model(); /* this is wrong */ 
0

另一个难以捉摸的原因可能是一个开放交易不被“承诺”。我有这样一个问题:在代码运行的前一阶段的一个打开的事务是而不是提交,导致在请求处理完成(成功与否 - 没有提交执行隐式回滚)时恢复数据库的所有更改。

哎呀,即使DB日志文件显示所有'插入'正确。它只有当我在日志“开始事务”中看到我已经变得可疑时,才在调试和观察代码流时确认我的怀疑。

相关问题