ing*_*ous 6 php activerecord yii yii2
我想用一个表添加记录ActiveRecord.
这是我的代码:
$model = new Article();
$model->title = 'test title';
$model->content = 'test content';
$model->category_id = 1;
$model->author_id = 1;
if ($model->validate()) {
$model->save();
}
Run Code Online (Sandbox Code Playgroud)
$model->validate()返回true,但$model->save()返回false.
如何查找生成的原始sql $model->save()?
与此同时:
$model->save()->rawSql是null并$model->getErrors()返回空数组.
在调试中,将记录所有查询,但我没有找到任何插入或更新查询.
$model->save()->rawSql调用不能返回null,它必须抛出一个你试图访问非对象属性的异常。$model->save()返回boolean值 - 查询执行成功与否。
如果$model->getErrors()返回空数组并且根本没有执行查询,我很确定模型事件处理程序有问题,尤其是beforeSave()检查它,它不应该return false。还要检查附加的行为事件处理程序。
至于获取查询。如果只是没有执行它是没有用的,但如果是,这里有一些方法可以实现它:
2)按照@robsch 的建议查看日志。
您不能直接在代码中使用 获取原始 SQL $model->save(),它会调用insert()或update()。如果您有兴趣,这里是代码的一部分insertInternal():
$values = $this->getDirtyAttributes($attributes);
if (empty($values)) {
foreach ($this->getPrimaryKey(true) as $key => $value) {
$values[$key] = $value;
}
}
$db = static::getDb();
$command = $db->createCommand()->insert($this->tableName(), $values);
if (!$command->execute()) {
return false;
}
Run Code Online (Sandbox Code Playgroud)
如果你打电话,$command->rawSql你会得到原始的 sql,但你不能在外面这样做,因为命令是在内部形成的。
PS这段代码:
if ($model->validate()) {
$model->save();
}
Run Code Online (Sandbox Code Playgroud)
没有意义,因为$model->save()会在$model->validate()内部调用。