Задать вопрос
@skajtersen

Как накопить данные перед записью в таблицы?

Есть массив строк - $rows, каждая строчка массива передается в функцию aggregator.

public function uploader($rows)
{
foreach ($rows as $row => $data) {
                $this->aggregator($data);
            }
...
}


В функции aggregator над каждой строкой выполняются многочисленые действия, после чего разные части строк записываются по таблицам.

public function aggregator($data)
{
...
table1->column1=data[1];
...
table1->column10=date[10];
table1->save();
...
table2->column1=data[11];
table2->column2=table1->column3;
...
table2->save();

}


Проблема в том, что для очень большого массива $rows запись занимает длительное время. Меня интересует как можно накопить записи в массив в функции aggregator, а потом записывать какое-нибудь определенное число строк в функции uploader. Нужен какой-нибудь batchInsert, но не совсем понятно, как написать его в этой ситуации.
  • Вопрос задан
  • 248 просмотров
Подписаться 2 Оценить 2 комментария
Решения вопроса 1
qonand
@qonand
Software Engineer
В функции aggregator над каждой строкой выполняются многочисленые действия, после чего разные части строк записываются по таблицам.

Плохо, метод должен отвечать только за реализацию одного логического действия, а не за все и сразу
Меня интересует как можно накопить записи в массив в функции aggregator,

По нормальному никак ... можно например использовать global или аналогичные варианты - но это будет плохой код

Лучше разделите ответственность методов, например так:

class MyClass
{
    public function uploader($rows)
    {
        $items = [];
        foreach ($rows as $row => $data) {
            $items[] = $this->aggregator($data);
        }
        $this->save($items)
    }

    public function aggregator($data)
    {
        // выполнение нужных операций над данными
    }

    public function save($items)
    {
        // сохранение массива данных, аля batchInsert
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@davidnum95
Использовать транзакции?
Ответ написан
Комментировать
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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