Save() не сохраняет данные в таблицу

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Clasen01
Сообщения: 15
Зарегистрирован: 2018.04.17, 03:44

Save() не сохраняет данные в таблицу

Сообщение Clasen01 »

Есть функция vakidateEdit() она необходима для того чтобы заполнить все поля в таблице и сохранить данные. Её листинг ниже

Код: Выделить всё

    /**
     * Функция валидирует и сохраняет новости в таблице this_day, если запись уже есть - обновляет ее
     * @return array
     */
    public function validateEdit() {
    
        $editNames = $this->editItems();
        $itemsDeleted = $this->deleteAllInThisYearAndDay();
        
        //Date -  дата публикации новости в блоке "В этот день...".
        //cdate - дата, когда была сгенерирована конкретная запись для блока "В этот день..." не путать с cdate
        //$model инициализируется в цикле для вставки нескольких элементов в таблицу

        foreach ($editNames as $key => $selectedNews) {
        
            $model = new ThisDay;
            $mkTime = mktime(0, 0, 0, date('m', Date::now()), date('d', Date::now()) + 1, date('Y', Date::now()));
            
            if ($model->load(Yii::$app->request->post(), '') && !$model->validate()) {
            
                //$selectedNews - массив с выбранными новостями
                //$id - id выбранных новостей
                //$newsText - заголовок выбранных новостей
                
                foreach ($selectedNews as $id => $newsText) {
                
                    $id = intval($id);
                    $model = new ThisDay;
                    $news = News::findNews($id);
                    
                    if ($itemsDeleted) {
                        
                        $model->news_name = $newsText;
                        $model->old_name = $news->name;
                        $model->user_id = Yii::$app->user->id;
                        $model->id_news = $id;
                        $model->editor_id = Yii::$app->user->id;
                        $model->id_region = REGION_ID;
                        $model->cdate = $mkTime;
                        //если новость в таблице - значит она выбрана
                        $model->checked = 1;
                        $timeToSave = mktime(0, 0, 0, date('m', $model->news->cdate_int), date('d', $model->news->cdate_int), date('Y', $model->news->cdate_int));
                        $model->pubDate = $mkTime;
                        $model->cdate_int = $timeToSave;
                        $model->day = date('j', $timeToSave);
                        $model->month = date('n', $timeToSave);
                        $model->save();
                    } else {
                        //сохраняет новые данные в модель, если запись уже есть в таблице
                        $updateModel = $this->updatingNew($id, $newsText, Yii::$app->user->id, $model->edate);
                    }
                }
            }
        }
        return $model;
    }
Ей помогают 3 метода, editItems(), deleteAllInThisYearAndDay() и updatingNew(). Их листинг ниже

Код: Выделить всё

    /**
     * Функция подхватывает post запрос с формы, обходит его и возвращает массив с текстом и ID
     * @return array
     */
    public function editItems() {
        $editNews = Yii::$app->request->post('ThisDay');
        
        foreach ($editNews["news_name"] as $year => $name) {
            $result[] = $name;
            
        }
        return $result;
    }

    /**
     * Функция обновления уже существующей записи в таблице this_day
     * @param integer $id
     * @param string $newsText
     * @param integer $editorId
     * @param integer $timeUp
     * @return array
     */
    public function updatingNew($id, $newsText, $editorId, $timeUp) {
    	
    	$model = ThisDay::findOne(['id_news' => $id]);
    	
    	if ($model) {
    	
        $model->news_name = $newsText;
        $model->editor_id = $editorId;
        $model->edate = $timeUp;
        $model->validate();
         
        return $model;
        
    	} else {
    	
    	return $model;
    	}
    }
    
        /**
     * Удаляет данные за год ($yearToDelete) и день ($dayToDelete)
     * @return boolean
     */
    public function deleteAllInThisYearAndDay() {
    
        $deleted = false;
        $editNames = $this->editItems();
        
        foreach ($editNames as $key => $selectedNews) {
            foreach ($selectedNews as $id => $newsText) {
            
                $thisDayNew = ThisDay::findOne(["id_news" => $id]);
                $news = News::findNews($id);
                $yearToDelete = date('Y', $news->cdate_int);
                $dayToDelete = date('j', $news->cdate_int);
                
                if (!$thisDayNew) {
                
                    ThisDay::deleteAll(["FROM_UNIXTIME(cdate_int, '%Y')" => $yearToDelete, "day" => $dayToDelete]);
                    $deleted = true;
                    
                } else
                    $deleted = false;
            }
        }
        return $deleted;
    }

Я вызываю функцию в action и получаю ошибку Call to undefined method stdClass::save() в функции updatingNew В чем может быть причина?

При том что в модели там данные следующего вида (но не для всех случаев, раньше возвращалась пустота, если модели нет, а теперь fatal error):

Код: Выделить всё

    object(\models\ThisDay)#337 (10) {
      ["_attributes":"yii\db\BaseActiveRecord":private]=>
      array(14) {
        ["id"]=>
        int(702)
        ["id_news"]=>
        int(601457)
        ["news_name"]=>
        string(134) "ÐО "ГЛОÐÐСС" изменило график поÑтавок "белых кнопок" в Приморье"
        ["old_name"]=>
        string(134) "ÐО "ГЛОÐÐСС" изменило график поÑтавок "белых кнопок" в Приморье"
        ["cdate_int"]=>
        int(1498510800)
        ["user_id"]=>
        int(195114)
        ["cdate"]=>
        int(1530093065)
        ["id_region"]=>
        int(43)
        ["pubDate"]=>
        int(1530133200)
        ["editor_id"]=>
        int(195114)
        ["edate"]=>
        int(1530097891)
        ["checked"]=>
        int(1)
        ["day"]=>
        int(27)
        ["month"]=>
        int(6)
      }
      ["_oldAttributes":"yii\db\BaseActiveRecord":private]=>
      array(14) {
        ["id"]=>
        int(702)
        ["id_news"]=>
        int(601457)
        ["news_name"]=>
        string(134) "ÐО "ГЛОÐÐСС" изменило график поÑтавок "белых кнопок" в Приморье"
        ["old_name"]=>
        string(134) "ÐО "ГЛОÐÐСС" изменило график поÑтавок "белых кнопок" в Приморье"
        ["cdate_int"]=>
        int(1498510800)
        ["user_id"]=>
        int(195114)
        ["cdate"]=>
        int(1530093065)
        ["id_region"]=>
        int(43)
        ["pubDate"]=>
        int(1530133200)
        ["editor_id"]=>
        int(195114)
        ["edate"]=>
        int(1530097891)
        ["checked"]=>
        int(1)
        ["day"]=>
        int(27)
        ["month"]=>
        int(6)
      }
      ["_related":"yii\db\BaseActiveRecord":private]=>
      array(0) {
      }
      ["_relationsDependencies":"yii\db\BaseActiveRecord":private]=>
      array(0) {
      }
      ["_errors":"yii\base\Model":private]=>
      NULL
      ["_validators":"yii\base\Model":private]=>
      NULL
      ["_scenario":"yii\base\Model":private]=>
      string(7) "default"
      ["_events":"yii\base\Component":private]=>
      array(2) {
        ["beforeInsert"]=>
        array(1) {
          [0]=>
          array(2) {
            [0]=>
            array(2) {
              [0]=>
              object(yii\behaviors\TimestampBehavior)#338 (7) {
                ["createdAtAttribute"]=>
                string(10) "created_at"
                ["updatedAtAttribute"]=>
                string(10) "updated_at"
                ["value"]=>
                NULL
                ["attributes"]=>
                array(2) {
                  ["beforeInsert"]=>
                  array(2) {
                    [0]=>
                    string(5) "cdate"
                    [1]=>
                    string(5) "edate"
                  }
                  ["beforeUpdate"]=>
                  array(1) {
                    [0]=>
                    string(5) "edate"
                  }
                }
                ["skipUpdateOnClean"]=>
                bool(true)
                ["preserveNonEmptyValues"]=>
                bool(false)
                ["owner"]=>
                *RECURSION*
              }
              [1]=>
              string(18) "evaluateAttributes"
            }
            [1]=>
            NULL
          }
        }
        ["beforeUpdate"]=>
        array(1) {
          [0]=>
          array(2) {
            [0]=>
            array(2) {
              [0]=>
              object(yii\behaviors\TimestampBehavior)#338 (7) {
                ["createdAtAttribute"]=>
                string(10) "created_at"
                ["updatedAtAttribute"]=>
                string(10) "updated_at"
                ["value"]=>
                NULL
                ["attributes"]=>
                array(2) {
                  ["beforeInsert"]=>
                  array(2) {
                    [0]=>
                    string(5) "cdate"
                    [1]=>
                    string(5) "edate"
                  }
                  ["beforeUpdate"]=>
                  array(1) {
                    [0]=>
                    string(5) "edate"
                  }
                }
                ["skipUpdateOnClean"]=>
                bool(true)
                ["preserveNonEmptyValues"]=>
                bool(false)
                ["owner"]=>
                *RECURSION*
              }
              [1]=>
              string(18) "evaluateAttributes"
            }
            [1]=>
            NULL
          }
        }
      }
      ["_eventWildcards":"yii\base\Component":private]=>
      array(0) {
      }
      ["_behaviors":"yii\base\Component":private]=>
      array(1) {
        ["timestamp"]=>
        object(yii\behaviors\TimestampBehavior)#338 (7) {
          ["createdAtAttribute"]=>
          string(10) "created_at"
          ["updatedAtAttribute"]=>
          string(10) "updated_at"
          ["value"]=>
          NULL
          ["attributes"]=>
          array(2) {
            ["beforeInsert"]=>
            array(2) {
              [0]=>
              string(5) "cdate"
              [1]=>
              string(5) "edate"
            }
            ["beforeUpdate"]=>
            array(1) {
              [0]=>
              string(5) "edate"
            }
          }
          ["skipUpdateOnClean"]=>
          bool(true)
          ["preserveNonEmptyValues"]=>
          bool(false)
          ["owner"]=>
          *RECURSION*
        }
      }
    }
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Save() не сохраняет данные в таблицу

Сообщение zelenin »

в вызове save проиисзодит валидация. после вызова можно вызвать getErrors() и посомтреть что там
Clasen01
Сообщения: 15
Зарегистрирован: 2018.04.17, 03:44

Re: Save() не сохраняет данные в таблицу

Сообщение Clasen01 »

zelenin писал(а): 2018.06.27, 15:08 в вызове save проиисзодит валидация. после вызова можно вызвать getErrors() и посомтреть что там
а где их будет видно? или это надо через var_dump делать?
Clasen01
Сообщения: 15
Зарегистрирован: 2018.04.17, 03:44

Re: Save() не сохраняет данные в таблицу

Сообщение Clasen01 »

zelenin писал(а): 2018.06.27, 15:08 в вызове save проиисзодит валидация. после вызова можно вызвать getErrors() и посомтреть что там
Сделать после save вот так:

Код: Выделить всё

var_dump($model->getErrors());
получил

Код: Выделить всё

array(0) {
}
array(0) {
}
array(0) {
}
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Save() не сохраняет данные в таблицу

Сообщение zelenin »

покажи код, где ты так прописал
Clasen01
Сообщения: 15
Зарегистрирован: 2018.04.17, 03:44

Re: Save() не сохраняет данные в таблицу

Сообщение Clasen01 »

zelenin писал(а): 2018.06.27, 15:26 покажи код, где ты так прописал
В функциях validateEdit и updatingNew

Код: Выделить всё

    /**
     * Функция обновления уже существующей записи в таблице this_day
     * @param integer $id
     * @param string $newsText
     * @param integer $editorId
     * @param integer $timeUp
     * @return array
     */
    public function updatingNew($id, $newsText, $editorId, $timeUp) {
    	$model = ThisDay::findOne(['id_news' => $id]);
    	if ($model !== null) {
    		if ( $model->validate() && $model->save()) {
    			$model->news_name = $newsText;
        		$model->editor_id = $editorId;
        		$model->edate = $timeUp;
        		$model->save();
       			return $model;
       			var_dump($model); exit;
    	}
    	
    	} else {
    	return $model;
    	}
    	
    }

    /**
     * Функция валидирует и сохраняет новости в таблице this_day, если запись уже есть - обновляет ее
     * @return array
     */
    public function validateEdit() {
        $editNames = $this->editItems();
        $itemsDeleted = $this->deleteAllInThisYearAndDay();
        //Date -  дата публикации новости в блоке "В этот день...".
        //cdate - дата, когда была сгенерирована конкретная запись для блока "В этот день..." не путать с cdate
        //$model инициализируется в цикле для вставки нескольких элементов в таблицу

        foreach ($editNames as $key => $selectedNews) {
            $model = new ThisDay;
            $mkTime = mktime(0, 0, 0, date('m', Date::now()), date('d', Date::now()) + 1, date('Y', Date::now()));
            if ($model->load(Yii::$app->request->post(), '') && !$model->validate()) {
                //$selectedNews - массив с выбранными новостями
                //$id - id выбранных новостей
                //$newsText - заголовок выбранных новостей
                foreach ($selectedNews as $id => $newsText) {
                    $id = intval($id);
                    //$thisDayNew = $model::findOne(["id_news" => (int) $id]);
                    $model = new ThisDay;
                        $news = News::findNews($id);
                    if ($itemsDeleted) {
//                        $yearToDelete = date('Y', $news->cdate_int);
//                        $dayToDelete = date('j', $news->cdate_int);
//                        ThisDay::deleteAll(["FROM_UNIXTIME(cdate_int, '%Y')" => $yearToDelete, "day" => $dayToDelete]);
                        $model->news_name = $newsText;
                        $model->old_name = $news->name;
                        $model->user_id = Yii::$app->user->id;
                        $model->id_news = $id;
                        $model->editor_id = Yii::$app->user->id;
                        $model->id_region = REGION_ID;
                        $model->cdate = $mkTime;
                        //если новость в таблице - значит она выбрана
                        $model->checked = 1;
                        $timeToSave = mktime(0, 0, 0, date('m', $model->news->cdate_int), date('d', $model->news->cdate_int), date('Y', $model->news->cdate_int));
                        $model->pubDate = $mkTime;
                        $model->cdate_int = $timeToSave;
                        $model->day = date('j', $timeToSave);
                        $model->month = date('n', $timeToSave);
                        $model->save();
                        var_dump($model); exit;
                    } else {
                        //сохраняет новые данные в модель, если запись уже есть в таблице
                        $updateModel = $this->updatingNew($id, $newsText, Yii::$app->user->id, $model->edate);
                    }
                }
            }
        }
        return $model;
    }
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Save() не сохраняет данные в таблицу

Сообщение zelenin »

не вижу
Clasen01
Сообщения: 15
Зарегистрирован: 2018.04.17, 03:44

Re: Save() не сохраняет данные в таблицу

Сообщение Clasen01 »

zelenin писал(а): 2018.06.27, 15:42не вижу
В каждой функции после $model->save(); Я разобрался в чем дело - неправильно работает функция deleteAllInThisYearAndDay(). Не подскажете что с ней не так? Она всегда возвращает false почему то
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Save() не сохраняет данные в таблицу

Сообщение zelenin »

Clasen01 писал(а): 2018.06.27, 15:49
zelenin писал(а): 2018.06.27, 15:42не вижу
В каждой функции после $model->save();
а я вас спросил про getErrors(), про который вы писали сообщением ранее.
Clasen01
Сообщения: 15
Зарегистрирован: 2018.04.17, 03:44

Re: Save() не сохраняет данные в таблицу

Сообщение Clasen01 »

zelenin писал(а): 2018.06.27, 15:52
Clasen01 писал(а): 2018.06.27, 15:49
zelenin писал(а): 2018.06.27, 15:42не вижу
В каждой функции после $model->save();
а я вас спросил про getErrors(), про который вы писали сообщением ранее.
Да уж.. рукалицо.. простите что ввел Вас в заблуждение) Просто торопился очень и не заметил ошибки) Но я уже все поправил и все работает, вопрос можно закрыть) Спасибо большое Вам за отзывчивость)

Проблема была в функциях updatingNew() и deleteAllInThisYearAndDay()

Я их updatingNew() я переделал, а в deleteAllInThisYearAndDay() просто удалил $deleted = false; вначале
Переработанная updatingNew()

Код: Выделить всё

    public function updatingNew($id, $newsText, $editorId, $timeUp) {
    	$model = ThisDay::findOne(['id_news' => $id]);
    	if ($model !== null) {
    		if ( $model->validate() && $model->save()) {
    			$model->news_name = $newsText;
        		$model->editor_id = $editorId;
        		$model->edate = $timeUp;
        		$model->save();
       			return $model;
    	}
    	
    	} else {
    	return $model;
    	}
    }
Ответить