Laravel Multi Insert с кавычками в стоимости

Мне нужно вставить большой набор записей в таблицу базы данных. Я получаю данные из файла CSV. Я думал об использовании инструкции multi-insert для хорошей производительности. Поэтому я сделал что-то похожее на следующее:

 foreach($data as $key => $value) {

   $insert[] = [
                'id' => $value->id, 'is_published' => $value->is_published,
                "first_name" => $value->first_name, "middle_name" => $value->middle_name, "last_name" => $value->last_name,
                "description" => $value->description,
                "created_at" => date("Y-m-d H:i:s",strtotime($value->created_at)),
                "updated_at" => date("Y-m-d H:i:s",strtotime($value->changed_at))
            ];
 }

 if(!empty($insert)){
     Model::insert($insert);
 }

Но при этом я всегда вижу ошибку:

Ошибка mysql сервера.

Я отлаживал его, распечатывая запрос, и я заметил, что, делая это, Laravel не заботится о одинарных кавычках или двойных кавычках в значении описания, поскольку это автоматически выполняется во время usiung $model::save();. Печатная версия запроса прерывается, если значение описания имеет одинарные кавычки ' или двойные кавычки ".

Но если я сделаю что-то вроде

foreach($data as $key=>$value){
   $model = new Model();
   $model->id = $value->id;
   $model->description = $value->description;
   blah blah bla

   $model->save();
}

Выполняется успешно, не генерируя никаких ошибок. Может ли кто-нибудь дать мне знать, как исправить эту проблему?

Ответ 1

Из-за большого набора данных ничего плохого в проблеме с кавычками. Когда вы пытаетесь вставить все строки сразу с помощью multi-insert, набор данных становится слишком тяжелым. Либо вам нужно увеличить max_allowed_packet, либо вам нужно сделать куски. Вы можете использовать кусок для этого. предположим, что вы хотите вставить 100 элементов за раз. вы можете сделать что-то подобное.

 if(!empty($insert))
 {

    $collection = collect($insert)->chunk(100)->toArray();

    foreach ($collection as $insert)
    {
       // It will insert 100 items at a time

        Model::insert($insert);
    }

 }

Надеюсь, это поможет:)

Ответ 2

Сколько записей вы пытаетесь вставить в объем? Можете ли вы попробовать всего два? Можете ли вы попытаться сделать отдельные вкладыши (например, 100 на 100).

Обычно ошибка Mysql has gone away означает, что сервер базы данных убил запрос, потому что он ожидал слишком много данных (ваш запрос слишком большой).

Обычно вы можете установить большее значение max_allowed_packet var в my.conf, чтобы вы могли отправлять больше данных за один раз.