【问题标题】:Can't insert into database with save()无法使用 save() 插入数据库
【发布时间】:2019-07-27 06:10:33
【问题描述】:

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

这是来自站点控制器

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',
        ]
    ];
}

【问题讨论】:

标签: sql database yii


【解决方案1】:

问题是您已经为表单创建了一个 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 将加载数据,但这不是最好的方法,因为它有点晦涩难懂。

希望对你有帮助

【讨论】:

    【解决方案2】:

    我猜问题出在验证上。

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

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

    其次,您可以在保存前转储post->getErrors(),看看验证是否有任何错误。你也可以打电话给$post->save(false)。如果给它传递false,它不会触发$post->validate(),一些错误可以忽略。如果有什么不清楚的地方请告诉我。

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多