Как отключить срабатывание update у save() при цикле?

Собствено вот сам код

$model = new Image();
     if ($model->load(Yii::$app->request->post())) {
     	foreach($files->files as $file){
      		$years=date('Y');
                    $mounts=date('m');
                    $model->path = $path.'/'.$years.'/'.$mounts.'/';
                    $model->name = $files_to;
                    $model->title_alt=$altNames." ".$count;
                    $model->save();
                     $file->saveAs(Yii::getAlias('@frontend/web/image/') . $path . '/' . $years . '/' . $mounts . '/' . $files_to);
                     }
    }




вот так в дебагере получается

INSERT INTO `fl_image` (`title_alt`, `for_home`, `id_film`, `path`, `name`) VALUES ('Тарзан. Легенда 0', 0, 1, 'film/2016/07/', '12089457.jpg')
    UPDATE `fl_image` SET `title_alt`='Тарзан. Легенда 1', `name`='Space-Desktop.jpg' WHERE `id`=2180
    UPDATE `fl_image` SET `title_alt`='Тарзан. Легенда 2', `name`='xJtqzdQr7RE.jpg' WHERE `id`=2180
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
qonand
@qonand
Software Engineer
метод save() устроен так что если запись есть он ее обновит, если записи нет - он ее добавит. Если нужно только добавить запись используйте метод $model->insert();

Но вообще в цикле вставлять записи в базу это зло, используйте лучше массовый инсерт
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@kryvel
Системный администратор
Мне кажется у Вас сама логика не правильная. Так как Ваш код просто в цикле перезаписывает данные для одного объекта.
Уточните, что именно Вы пытаетесь сделать. Создать несколько записей с одинаковым id но с разными title_alt i name ? Либо Вам нужно для одного id хранить массив из title_alt i name
Ответ написан
mhthnz
@mhthnz
PHP, YII2, Golang, Linux
При записи пакетных данных, в каждой итерации цикла вы должны создавать новый инстанс вашей модели. Можно создать метод в модели saveAll() и в нем в цикле все это сохранять. + при сохранении пакетных данных, необходимо использовать транзакции, если у вас возникнет ошибка сохранения каких то данных, то часть данных запишется, а часть нет. Транзакция же решает эту проблему.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы