无法使用save()插入数据库

时间:2019-07-27 06:10:33

标签: sql database yii

将记录插入数据库时​​出现问题。我是Yii框架的初学者,所以我可能犯了一些愚蠢的错误。

这是来自SiteController

public function actionCreatePost(){
     $model = new PostForm();

     $post = new Post();

    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        $post->body = $model->body;
        $post->title = $model->title;
        $post->save();

        return $this->redirect('index');
    }else {
        return $this->render('createPost', ['model' => $model]);
    }
}

这是来自Post类

public function behaviors()
{
    return [
        [
            'class' => TimestampBehavior::className(),
            'createdAtAttribute' => 'created_at',
            'updatedAtAttribute' => 'updated_at',
            'value' => new Expression('NOW()'),
        ],
        [
            'class' => BlameableBehavior::className(),
            'createdByAttribute' => 'id_author',
        ]
    ];
}

2 个答案:

答案 0 :(得分:0)

我想问题在于验证。

我将看到一些要指出的问题。首先,我无法弄清楚为什么要创建new PostForm,将数据加载到其中并进行验证,只是将某些值转储到new Post中并保存。您是否在PostForm模型中运行由loadverify触发的某些功能?如果不是这种情况,我建议删除其中一个模型,而仅使用另一个模型。通常,这就是Form模型。它充当ActiveFormmodel之间处理所有内容的链接。您可以在createPost()模型的Form函数中进行所有操作,然后在控制器中将看起来像

    if ($model->load(Yii::$app->request->post())) {
          $model->save();
          return $this->redirect('index');
    }

第二,您可以在保存之前转储post->getErrors(),以查看验证是否存在任何错误。您还可以做的是调用$post->save(false)。如果将false传递给它,它将不会触发$post->validate(),并且可以忽略一些错误。请让我知道是否有任何不清楚的地方。

答案 1 :(得分:0)

问题是您已经为表单创建了PostForm类(这是正确的),但是随后您尝试将响应加载到Post类中-这是一个完全不同的类。未经修改将无法使用。

如果您查看回复:

var_dump(Yii:$app->request->post()); 

您将看到表单数据位于PostForm键中。 Yii因此只会将数据加载到PostForm类中。

因此,正确的解决方案是在PostForm中创建一个savePost()函数,例如:

public function savePost(){
$model = new Post();
$model->propertyABC = $this->propertyABC
...etc...
$model->save();

因此该操作将显示如下:

$model = new PostForm();
If($model->load(Yii::$app->request->post()) && $model->validate()){
$model->savePost();

另一个选择是将密钥从PostForm重命名为Post。 Yii然后将加载数据,但这不是最好的方法,因为它有点晦涩。

希望有帮助