Как исправить один раз петлю коллекции laravel? - PullRequest
0 голосов
/ 13 октября 2019

У меня проблема с сбором laravel с результатом чанка. Он запускается только один раз в цикле.

У меня есть 204 элемента в массиве, и я хочу разделить его на 100 каждый, используя вспомогательный сборщик laravel. Он должен работать три раза, но я получил только один раз.

    private function __migrateDistricts()
    {
        DB::beginTransaction();
        try {
            $file = 'resources/csv/districts.csv';
            $csv = array_map('str_getcsv', file($file));
            $table = 'districts';
            $collection = collect($csv);
            $arr_districts = array();
            foreach ($collection->chunk(100) as $districts) {
                foreach ($districts as $dist) {
                    array_push($arr_districts, $this->__transformDistricts($dist));
                }
                DB::table($table)->insert($arr_districts);
                DB::commit();
            }
        } catch (\Exception $e) {
            DB::rollBack();
        }
    }

    private function __transformDistricts($district)
    {
        $code = substr($district[3],0,2);
        $pro = DB::table('provinces')->where('code', $code)->first();
        return [ 
            'province_id' => $pro->id,
            'name_kh' => $district[1],
            'name_en' => $district[2],
            'code' => $district[3],
        ];
    }

После запуска я получил только 100 записей в таблице. В таблице должно быть 204 записи. Что не так с моим кодом? Спасибо

1 Ответ

1 голос
/ 13 октября 2019

В вашем коде ...

$arr_districts = array();
foreach ($collection->chunk(100) as $districts) {
    foreach ($districts as $dist) {
        array_push($arr_districts, $this->__transformDistricts($dist));
    }
    DB::table($table)->insert($arr_districts);
    DB::commit();
}

в каждом внутреннем цикле вы добавляете данные в $arr_districts, который во второй раз вашего внешнего цикла будет по-прежнему содержать данные из первогоloop.

Вы должны сбросить этот массив для каждого основного цикла, чтобы очистить данные ...

foreach ($collection->chunk(100) as $districts) {
    $arr_districts = array();        // Move to here
    foreach ($districts as $dist) {
        array_push($arr_districts, $this->__transformDistricts($dist));
    }
    DB::table($table)->insert($arr_districts);
    DB::commit();
}
...