Сохранение данных в промежуточную таблицу

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Vadim7423
Сообщения: 41
Зарегистрирован: 2016.07.07, 20:21

Сохранение данных в промежуточную таблицу

Сообщение Vadim7423 » 2019.09.12, 21:32

Здравствуйте.
Есть таблица с товарами и таблица с категориями, которые связаны промежуточной таблицей, так как один и тот же товар может быть в нескольких категориях.
При сохранении или изменении товара связь с категориями обрабатывается в afterSave():

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

if($this->categories && !empty($this->categories)){
            $this->unlinkAll('cats', true);
            foreach($this->categories as $value){
                $item = PartsCategories::findOne($value);
                $this->link('cats', $item);
            }
        }
В стандартном CRUD после отправки формы с данными товара все отрабатывает нормально как при добавлении так и при обновлении.
Пытаюсь загрузить экселевскую таблицу с товарами в другом контроллере:

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

if (Yii::$app->request->isPost) {
            $model->file = UploadedFile::getInstance($model, 'file');
            if ($model->upload()) {
                $data = \moonland\phpexcel\Excel::import('uploads/' . $model->file->name, [
                    'setFirstRecordAsKeys' => false,  
                    'setIndexSheetByName' => false
                ]); 
             
                foreach($data as $key => $value){
                    
                    $id = $value['B'];
                    $item = Parts::findOne($id);
                    if(!$item){
                        $item = new Parts();
                    }
                    
                    $categories = explode(', ', $value['I']);
                    $item->categories = $categories;
                    $item->save();
                }
                Yii::$app->session->setFlash('success', "Импорт выполнен");
                return $this->redirect(Yii::$app->request->referrer);
            }
        }
Выдается ошибка:

Call to a member function getIsNewRecord() on null

if ($this->getIsNewRecord() || $model->getIsNewRecord()) {
throw new InvalidCallException('Unable to link models: the models being linked cannot be newly created.');
}

Аватара пользователя
ElisDN
Сообщения: 5358
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Сохранение данных в промежуточную таблицу

Сообщение ElisDN » 2019.09.12, 22:37

PartsCategories::findOne($value) ничего не нашёл.

Vadim7423
Сообщения: 41
Зарегистрирован: 2016.07.07, 20:21

Re: Сохранение данных в промежуточную таблицу

Сообщение Vadim7423 » 2019.09.12, 22:57

ElisDN писал(а):
2019.09.12, 22:37
PartsCategories::findOne($value) ничего не нашёл.
Сделал распечатку массива который отправляется в контроллере и который попадает в foreach в afterSave():
Котроллер:

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

$item->categories = $categories;
print_r($item->categories);
exit();
$item->save();
Модель:

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

         if($this->categories && !empty($this->categories)){
            $cats = $this->categories;
            print_r($cats);
            exit();
            $this->unlinkAll('cats', true);
            foreach($cats as $value){
                $item = PartsCategories::findOne($value);
                $this->link('cats', $item);
            }
        }
В afterSave() попадает весь список категорий, а не тех что попадает в модель $item. Что я не так делаю?)

yiiliveext
Сообщения: 159
Зарегистрирован: 2019.08.13, 01:49

Re: Сохранение данных в промежуточную таблицу

Сообщение yiiliveext » 2019.09.13, 09:38

Как $item->categories получает начальные значения?

Vadim7423
Сообщения: 41
Зарегистрирован: 2016.07.07, 20:21

Re: Сохранение данных в промежуточную таблицу

Сообщение Vadim7423 » 2019.09.13, 10:34

yiiliveext писал(а):
2019.09.13, 09:38
Как $item->categories получает начальные значения?
Проблема была в explode(). При пустой строке формировался массив 0 => [0], который попадал в $item->categories

Ответить