使用laravel excel和laravel队列导入大型excel文件

使用laravel excel和laravel队列导入大型excel文件,excel,laravel,Excel,Laravel,laravel excel 3.1版 laravel版本5.6 我在excel文件中有超过100000行的数据。我想将此数据导入我的数据库 在My controller.php中 if(request()->file('fertilizer_import')) { $import = new FertilizerImport(); $file = request()->file('fertilizer_import'); dispatch(new Fertil

laravel excel 3.1版 laravel版本5.6 我在excel文件中有超过100000行的数据。我想将此数据导入我的数据库

在My controller.php中

if(request()->file('fertilizer_import')) {
    $import = new FertilizerImport();
    $file = request()->file('fertilizer_import');
    dispatch(new FertilizerImportJob($import, $file));
}
public function __construct($import, $file)
{
    $this->import = $import;
    $this->file = $file;
}
public function handle()
{
    Excel::import($this->import, $this->file);
}
在my FertifizerImportJob.php中

if(request()->file('fertilizer_import')) {
    $import = new FertilizerImport();
    $file = request()->file('fertilizer_import');
    dispatch(new FertilizerImportJob($import, $file));
}
public function __construct($import, $file)
{
    $this->import = $import;
    $this->file = $file;
}
public function handle()
{
    Excel::import($this->import, $this->file);
}
然后,我上传了我的excel文件。在“作业”表中输入一行是不正确的。我运行了
php artisan make:queue
,但数据并没有进入我的肥料表。
我该怎么做?请告诉我。

您应该尝试在laravel/Maatwebsite中使用chunk和queue 在控制器文件中

public function importExcel()
    {
        $path = resource_path() . "/Houten.xlsx";
        \Excel::import(new TestImport, $path);
        return redirect('/')->with('success', 'All good!');
    return back();
    }
在导入文件app/Imports/testImports.php中

use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithStartRow;
use Illuminate\Contracts\Queue\ShouldQueue;
use Maatwebsite\Excel\Concerns\WithChunkReading;

class TestImport implements ToCollection, WithChunkReading, ShouldQueue,WithStartRow
{
    public function collection(Collection $rows)
    {
        //do your insertion here. //no seprate job required
    }

     public function startRow(): int 
    {
         return 1;
    }

    public function batchSize(): int
    {
        return 500;
    }

    public function chunkSize(): int
    {
        return 500;
    }
}
然后设置QUEUE_DRIVER=database并运行代码。您将在jobs表中看到一个条目。然后,您需要运行此作业。有多种方法可以运行任何作业。下面是一个 在你的终端

php artisan queue:restart
php artisan queue:listen

这将分块执行集合函数中的代码,并插入数据

您应该尝试在laravel/Maatwebsite中使用chunk和queue 在控制器文件中

public function importExcel()
    {
        $path = resource_path() . "/Houten.xlsx";
        \Excel::import(new TestImport, $path);
        return redirect('/')->with('success', 'All good!');
    return back();
    }
在导入文件app/Imports/testImports.php中

use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithStartRow;
use Illuminate\Contracts\Queue\ShouldQueue;
use Maatwebsite\Excel\Concerns\WithChunkReading;

class TestImport implements ToCollection, WithChunkReading, ShouldQueue,WithStartRow
{
    public function collection(Collection $rows)
    {
        //do your insertion here. //no seprate job required
    }

     public function startRow(): int 
    {
         return 1;
    }

    public function batchSize(): int
    {
        return 500;
    }

    public function chunkSize(): int
    {
        return 500;
    }
}
然后设置QUEUE_DRIVER=database并运行代码。您将在jobs表中看到一个条目。然后,您需要运行此作业。有多种方法可以运行任何作业。下面是一个 在你的终端

php artisan queue:restart
php artisan queue:listen

这将分块执行集合函数中的代码,并插入数据

你的作业参数看起来顺序不对-应该是这样吗?您正在首先传递
$file
,但希望
$file
是构造函数中的第二个参数?@DelenaMalan我更新了我的代码。您使用的队列驱动程序是什么?@DelenaMalan我使用了
队列驱动程序=数据库
。您对作业的参数看起来顺序不对-应该是这样的吗?您正在首先传递
$file
,但希望
$file
成为构造函数中的第二个参数?@DelenaMalan我更新我的代码。您使用的队列驱动程序是什么?@DelenaMalan我使用了
queue\u driver=database
。这工作得很好,但根据batchSize与ToModel相关,而对于具有读块特征的ToCollection plus来说,情况并非如此。最后,WithStartRow可以从一个特定的行开始,这在开发过程中很有用,但在这个示例中没有明确的必要。谢谢!我在找那个。工作完美。很高兴它起到了作用。这很好,但根据batchSize与ToModel相关,而对于具有ChunkReading特性的ToCollection plus,情况并非如此。最后,WithStartRow可以从一个特定的行开始,这在开发过程中很有用,但在这个示例中没有明确的必要。谢谢!我在找那个。很好用,很高兴能帮上忙。