@Hancock_888

Как сохранить за два запроса 100 статей и связанныех с ними 200 картинок на Yii2?

Добрый день, всем. Подскажите возможно ли сохранить 300 записей за два запроса к базе.
К примеру есть две таблицы: статьи и картинки к ним.

article
-----------------------
id
title
description

article_image
-----------------------
id
article_id
name

Мне приходит массив статьи и ссылки на картинки.
$articles = [
            'article_1' => [
                'title' => 'Title 1',
                'description' => 'text 1',
                'images' =>['name1.jpg','name2.jpg']
            ],
            'article_2' => [
                'title' => 'Title 2',
                'description' => 'text 2',
                'images' =>['name3.jpg','name4.jpg']
            ], // ...
        ];


Множественное сохранения картинок в одном запросе я уже усвоил,
я пробегаю по массиву статей и генерирую массив картинок и затем сохраняю.
\Yii::$app->db
            ->createCommand()
            ->batchInsert('article_image', ['article_id', 'name'], [
                [1, 'name1.jpg'],
                [2, 'name2.jpg'],
                [3, 'name3.jpg'],
            ])
            ->execute();


Т.е. сейчас
у меня 101 запрос к базе:
100 запросов на сохранение статей
и 1 запрос на сохранения картинок.

Как можно сохранить за 2 запроса ? проблема в том что при сохранения картинок нужен article_id который возможно получить только при сохранении статьи.

Или подскажите как вы решаете вопрос оптимизации запросов к базе при множественном сохранении?

Придумал один способ как сохрнатить 100 статей 200 картинок за 3 запроса
1. первый запрос сохраняет 100 статей с уникальным номер (добавлена новая колонка unique_number, и я генерирую сам и сохраняю в массив )
2 . второй запрос делаю выботку по 100 unique_number которые только сгенерировал получаю Ids статей, преобразую
unique_number -> id
3. сохраняю 200 картинок одним запросом
  • Вопрос задан
  • 182 просмотра
Решения вопроса 1
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
единственный вариант - выбрать max(id) из артикла, лочить таблицу, вручную присобачить иды начиная от максимального, инсерт, затем анлок таблицы.
Решение не очень нормальное, т.к. "ломает" нормальную работу автоинкремента, что не есть гуд. Но работать будет.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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