yii 无法使用保存()插入数据库

3z6pesqy  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(172)

我在将记录插入数据库时遇到了问题。我是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',
        ]
    ];
}
0wi1tuuw

0wi1tuuw1#

问题是,您已经为表单创建了一个PostForm类(这是正确的),但您随后试图将响应加载到Post类中--一个完全不同的类。如果不进行修改,这将无法工作。
如果你看一下React:

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将加载数据,但这不是最好的方法,因为它有点模糊。
希望能有所帮助

q8l4jmvw

q8l4jmvw2#

我猜问题出在验证上。
我可以看到几个问题,我将指出。首先,我不明白为什么要创建一个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(),有些错误可以忽略。如果有什么不清楚的地方,请告诉我。

相关问题