@phpForeve

Yii2 В базу сохраняется сразу 2 записи. Почему?

История такая. Когда я захожу на страницу /create - автоматически создается запись в бд. После чего меня редиректит на /update. Где я начинаю работать с этой записью.

public function actionCreate(){
        $model = new NewsForm();
        $model->create_at = (new DateTime())->format('Y-m-d H:i:s');
        $model->update_at = (new DateTime())->format('Y-m-d H:i:s');
        if ($news = $model->create()) {
            //TODO Tosters
            //var_dump($news->id);
            return Yii::$app->getResponse()->redirect('/news/update/'. $news->id);
        }
    }

    public function actionUpdate()
    {
        $request = Yii::$app->request;
        $get = $request->get();

        $model = News::findOne($get['id']);

        if ($model->load(Yii::$app->request->post())) {
            $model->create_at = (new DateTime())->format('Y-m-d H:i:s');
            $model->update_at = (new DateTime())->format('Y-m-d H:i:s');
            if ($model->status != News::STATUS_ARCHIVE) {
                $model->publish_at = (new DateTime())->format('Y-m-d H:i:s');
            }
            if ($news = $model->create()) {
                //TODO Tosters
                Yii::$app->getResponse()->redirect('/news');
            }
        }

        return $this->render('update', compact('model'));
    }


Если не делать редирект то в базе создается 1 запись. После редиректа создается еще одна... Причем, если зайти на /update вручную, никаких записей не будет сделано. Вот как так то?

Например. /create создает $id = 105 (Говорит мне об этом). а в /update приходит $id = 106
  • Вопрос задан
  • 564 просмотра
Пригласить эксперта
Ответы на вопрос 2
slo_nik
@slo_nik Куратор тега Yii
Доброй ночи.
Почему в действии create нет подобной проверки?
if ($model->load(Yii::$app->request->post()))
Подобное
Yii::$app->getResponse()->redirect('/news');
можно с успехом заменить на
return $this->redirect('/news')
Зачем такая конструкция?
if ($news = $model->create()) {
не проще ли писать так
if ($model->save()) {
 // и получить id
  $model->id;

Откуда Вы берёте $model->create() и что в там внутри?
Вот, ещё подсказал Антон Натаров, зачем Вы пишите этот бред с временем?
(new DateTime())->format('Y-m-d H:i:s');
В yii2 есть TimestampBehavior, вот через этот класс и настраивайте время, в модели, а не в контроллере.
Статус тоже проверяйте в модели, в методах beforeSave() или AfterSave()
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Код ужасный, но дело скорее всего тут:
$model->create()
Он у Вас в обоих экшенах. Покажите метод create в моделе.
По датам советую посмотреть вот это:
demos.krajee.com/datecontrol - очень удобно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы