Laravel / Mysql - манипулировать большими данными - PullRequest
2 голосов
/ 30 мая 2019

Уважаемые,

На самом деле, я хотел бы знать лучшее решение для манипулирования БОЛЬШИМИ ДАННЫМИ в LARAVEL / MYSQL.

В моей системе я загружаю ежедневный файл Excel (5K строк) вмоя БД, если я нахожу ту же строку в своей таблице, чтобы не вставлять ее, и если я нахожу ту же строку, я менял загруженную дату в своей БД.

Каждый раз, когда я загружаю ExcelЯ проверяю каждую строку, если есть в моей таблице (таблица содержит> 50 КБ) с обычным массивом, как показано ниже

           $res = policies::where('phone', '=', $row['phone'])
                      ->where('draft_no', '=', $row['draftno'])
                      ->where('due_date', '=', $duedate)
                      ->where('status', '=', $stat)
                      ->where('bord_date', '=', $borddate)
                      ->where('amount', '=', $row['amnt'])
                      ->where('remarks', '=', $row['remarks'])
                      ->exists();

                    if(!$res) { 
                   // insert row ($table->save())
                    }
                    else {
                      //update uploaded date to this row.
                    }

этот процесс занимает много времени bcz каждый раз при проверке таблицы.Я пытался использовать array_chunk для вставки, но, тем не менее, нагрузка большая (от 15 минут до 20 минут) до конца

Ваш совет очень важен.

Спасибо

Ответы [ 3 ]

1 голос
/ 30 мая 2019

Вы можете создать хеш каждой строки и хранить вместе со строкой. Затем проверьте только строку с данным хешем.

Например, попробуйте эту заглушку кода

foreach ($rows as $row) {
    $hash = md5($row['phone'] . $row['draft_no'] . $row['due_date'] ...);
    $res = Policiess::where('hash', $hash);
    if (!$res) {
         // create a new row and store the `$hash` in `hash` column
    } else {
         //update uploaded date to this row
    }
}
0 голосов
/ 30 мая 2019

Почему бы не использовать метод elaquent по умолчанию в laravel updateOrCreate.Надеюсь, что вы уже читали об этом, если вы этого не сделаете, вы можете прочитать это из документации other-creation-method .

Позвольте мне объяснить, что на самом деле это делает.

Принимает array значений и проверяет, что значение уже есть в базе данных. Если оно уже есть в базе данных, оно обновит эти значения, а также обновит столбец updated_at или, если его еще нет в базе данных, оносоздаст новую запись в таблице.

См., например, ниже: -

policies::updateOrCreate(['value'=>1,'value'=>2,'so on...']);

и не забудьте добавить protected $fillable = [your column], потому что для этого используется $ fillable.

0 голосов
/ 30 мая 2019

если вы не добавите новую запись в тот же Excel, то не нужно проверять в базе данных. но вы добавляете в тот же файл Excel новую запись, а затем вставляете все записи после обновления этого файла Excel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...