проблема с maatwebsite / excel и \ DB :: commit ();

Я пытаюсь сохранить некоторые данные в базе данных, и сразу после того, как я пытаюсь загрузить и превзойти файл с этими данными. Итак, я заметил, что пакет excel блокирует мою фиксацию, и, очевидно, он не позволяет мне хранить данные в БД. Это мой код. - Я использую Laravel 5.5 - "maatwebsite / excel": "~ 2.1.0",

public function refundTicketAndGenerateExcel($transactions, $table)
{   
    try 
    {   
        \DB::beginTransaction();

            $this->storeRefundData($transactions);
            $response = $this->generateExcel($table);

        \DB::commit();
        return $response;
    } 
    catch (\Exception $e) 
    {   
        \DB::rollback();
        \Log::error($e);
        $result['message'] = $e->getMessage();
        return response()->json($result, 500);
    }
}

public function generateExcel($table)
{   
    Excel::create('Reembolsos', function ($excel) use ($table) {
                    $excel->sheet('Reembolsos', function ($sheet) use ($table) {

                        $FontStyle = array(
                            'font' => array(
                                'name' => 'Arial',
                                'color' => array('rgb' => '000000'),
                                'size' => 11
                            ),
                        );

                        $sheet->loadView($this->path . '.partials.excel', ['table'=>$table]);
                        $sheet->getStyle('A1:K1000')->applyFromArray($FontStyle);
                    });

                })->export('xls');
}

PD: Если я просто прокомментирую \ DB :: beginTransaction () и \ DB :: commit (), все будет работать нормально; С другой стороны, если я просто прокомментирую блок Excel :: create, все тоже будет работать нормально; Вот почему я говорю, что пакет Excel блокирует мою фиксацию.

Заранее спасибо.


person Carlos GR    schedule 25.11.2019    source источник


Ответы (1)


Когда вы вызываете export (), он убивает ваш скрипт. Довольно убогий дизайн, если честно:

protected function _download(Array $headers = [])
{
    $filename = $this->filename;
    $userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
    // Just for Microsoft Explore
    if (preg_match('/Trident|Edge/i', $userAgent)) {
        $filename = rawurlencode($filename);
    }
    // Set the headers
    $this->_setHeaders(
        $headers,
        [
            'Content-Type'        => $this->contentType,
            'Content-Disposition' => 'attachment; filename="' . $filename . '.' . $this->ext . '"',
            'Expires'             => 'Mon, 26 Jul 1997 05:00:00 GMT', // Date in the past
            'Last-Modified'       => Carbon::now()->format('D, d M Y H:i:s'),
            'Cache-Control'       => 'cache, must-revalidate',
            'Pragma'              => 'public'
        ]
    );
    // Check if writer isset
    if (!$this->writer)
        throw new LaravelExcelException('[ERROR] No writer was set.');
    // Download
    $this->writer->save('php://output');
    // End the script to prevent corrupted xlsx files
    exit;
}

https://github.com/Maatwebsite/Laravel-Excel/blob/2.1/src/Maatwebsite/Excel/Writers/LaravelExcelWriter.php#L347-L377

Исправьте это, вернув объект записи, который возвращает Excel::create(), и удалите часть ->export().

$writer = Excel::create(blah blah blah); // no->export() now!
return $writer;

Затем выполните экспорт после фиксации.

 $writer = $this->generateExcel($table);
 \DB::commit();
 return $writer->export();
person delboy1978uk    schedule 25.11.2019
comment
Прекрасно работает, ты мне спасатель @delboy. Большое тебе спасибо. - person Carlos GR; 25.11.2019
comment
Рад, что смог помочь, получайте удовольствие от кодирования! - person delboy1978uk; 28.11.2019