Yii2:获取model-> save()的原始sql

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()->rawSqlnull$model->getErrors()返回空数组.

在调试中,将记录所有查询,但我没有找到任何插入或更新查询.

aro*_*hev 5

$model->save()->rawSql调用不能返回null,它必须抛出一个你试图访问非对象属性的异常。$model->save()返回boolean值 - 查询执行成功与否。

如果$model->getErrors()返回空数组并且根本没有执行查询,我很确定模型事件处理程序有问题,尤其是beforeSave()检查它,它不应该return false。还要检查附加的行为事件处理程序。

至于获取查询。如果只是没有执行它是没有用的,但如果是,这里有一些方法可以实现它:

1)可能是最好的方法。使用调试面板。我也在这里提到

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()内部调用。