$ model-> save()返回true但没有创建记录,id为null

时间:2014-01-31 13:05:32

标签: php yii model

我在我的控制器的actionCreate中有这个代码,它是通过Ajax调用的:

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

这会将{" id":null}返回到我的对话框,并且数据库中没有创建任何记录,Yii也没有记录任何内容。这已经工作了很长时间,我无法看到我在git日志中打破它所做的任何事情。什么可能导致这种情况?

5 个答案:

答案 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)

另一个难以理解的原因可能是没有承诺的公开交易。我遇到了这样一个问题:代码运行的前一阶段的一个开放事务已提交,导致一旦请求处理完成就会恢复对数据库的所有更改(成功与否 - 没有提交隐含回滚)。

哎呀,即使数据库日志文件显示所有'插入'正确。只有当我在日志中看到“开始交易”时...我已经开始怀疑,只是为了在调试和观察代码流程时确认我的怀疑。