无法使用 save() 插入数据库
Can't insert into database with save()
我在将记录插入数据库时遇到问题。我是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]);
}
}
本文来自Postclass
public function behaviors()
{
return [
[
'class' => TimestampBehavior::className(),
'createdAtAttribute' => 'created_at',
'updatedAtAttribute' => 'updated_at',
'value' => new Expression('NOW()'),
],
[
'class' => BlameableBehavior::className(),
'createdByAttribute' => 'id_author',
]
];
}
我想问题出在验证上。
我可以看到几个问题我会指出。首先,我不明白你为什么要创建一个 new PostForm
,在其中加载数据并验证它,只是为了将一些值转储到 new Post
中并保存它。 PostForm
模型中的 运行 是否有某些功能由 load
或 verify
触发?如果不是这种情况,我会建议放弃其中一个模型,而只使用另一个模型。通常,这是 Form
模型。它作为 ActiveForm
和 model
之间的 link 来处理所有事情。您可以在 Form
模型中的 createPost()
函数中执行所有操作,然后在控制器中它看起来像
if ($model->load(Yii::$app->request->post())) {
$model->save();
return $this->redirect('index');
}
其次,您可以在保存前转储post->getErrors()
以查看验证是否有任何错误。您还可以做的是调用 $post->save(false)
。如果给它传false,它不会触发$post->validate()
,有些错误可以忽略。如果有什么不清楚的地方请告诉我。
问题是您已经为表单创建了一个 Post表单 class(这是正确的),但是您随后试图将响应加载到 Post class - 一个完全不同的 class。如果不修改,这是行不通的。
如果您查看回复:
var_dump(Yii:$app->request->post());
您会看到表单数据位于 Post表单键中。因此,Yii 只会将数据加载到 PostForm class.
因此,正确的解决方案是在 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 将加载数据,但这不是最好的方法,因为它有点晦涩。
希望对你有帮助
我在将记录插入数据库时遇到问题。我是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]);
}
}
本文来自Postclass
public function behaviors()
{
return [
[
'class' => TimestampBehavior::className(),
'createdAtAttribute' => 'created_at',
'updatedAtAttribute' => 'updated_at',
'value' => new Expression('NOW()'),
],
[
'class' => BlameableBehavior::className(),
'createdByAttribute' => 'id_author',
]
];
}
我想问题出在验证上。
我可以看到几个问题我会指出。首先,我不明白你为什么要创建一个 new PostForm
,在其中加载数据并验证它,只是为了将一些值转储到 new Post
中并保存它。 PostForm
模型中的 运行 是否有某些功能由 load
或 verify
触发?如果不是这种情况,我会建议放弃其中一个模型,而只使用另一个模型。通常,这是 Form
模型。它作为 ActiveForm
和 model
之间的 link 来处理所有事情。您可以在 Form
模型中的 createPost()
函数中执行所有操作,然后在控制器中它看起来像
if ($model->load(Yii::$app->request->post())) {
$model->save();
return $this->redirect('index');
}
其次,您可以在保存前转储post->getErrors()
以查看验证是否有任何错误。您还可以做的是调用 $post->save(false)
。如果给它传false,它不会触发$post->validate()
,有些错误可以忽略。如果有什么不清楚的地方请告诉我。
问题是您已经为表单创建了一个 Post表单 class(这是正确的),但是您随后试图将响应加载到 Post class - 一个完全不同的 class。如果不修改,这是行不通的。
如果您查看回复:
var_dump(Yii:$app->request->post());
您会看到表单数据位于 Post表单键中。因此,Yii 只会将数据加载到 PostForm class.
因此,正确的解决方案是在 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 将加载数据,但这不是最好的方法,因为它有点晦涩。
希望对你有帮助