Не удается вставить в базу данных с помощью 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]);
    }
}

Это из класса Post

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

взгляните на этот stackoverflow.com/questions/33759514/…

ScaisEdge 27.07.2019 08:13
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я предполагаю, что проблема связана с проверкой.

Я вижу несколько проблем, на которые я укажу. Во-первых, я не могу понять, зачем вы создаете 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 загрузит данные, но это не лучший подход, так как он немного непонятен.

надеюсь, это поможет

Другие вопросы по теме