У меня возникла проблема со вставкой записи в базу данных. Я новичок в фреймворке 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',
]
];
}
Я предполагаю, что проблема связана с проверкой.
Я вижу несколько проблем, на которые я укажу. Во-первых, я не могу понять, зачем вы создаете new PostForm
, загружаете в него данные и проверяете их, просто для того, чтобы выгрузить некоторые значения в new Post
и сохранить его. Есть ли какие-то функции, которые вы используете в модели PostForm
, которые запускаются load
или verify
? Если это не так, я бы предложил отказаться от одной из моделей и использовать только другую. Обычно это модель Form
. Он служит связующим звеном между ActiveForm
и model
, управляющим всем. В функции createPost()
в модели Form
можно сделать все, и тогда в контроллере это будет выглядеть так
if ($model->load(Yii::$app->request->post())) {
$model->save();
return $this->redirect('index');
}
Во-вторых, вы можете сбросить post->getErrors()
перед сохранением, чтобы увидеть, есть ли какие-либо ошибки при проверке. Что вы также можете сделать, так это вызвать $post->save(false)
вместо этого. Если вы передадите ему false, он не сработает $post->validate()
, а некоторыми ошибками можно пренебречь. Пожалуйста, дайте мне знать, если есть что-то непонятное.
Проблема в том, что вы создали класс PostForm для формы (что правильно), но затем пытаетесь загрузить ответ в класс Post — совершенно другой класс. Это не будет работать без модификации.
Если вы посмотрите на ответ:
var_dump(Yii:$app->request->post());
Вы увидите, что данные формы находятся в ключе PostForm. Поэтому Yii будет загружать данные только в класс PostForm.
Поэтому правильным решением является создание функции savePost() в PostForm, например:
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 загрузит данные, но это не лучший подход, так как он немного непонятен.
надеюсь, это поможет
взгляните на этот stackoverflow.com/questions/33759514/…