使用laravel excel和laravel队列导入大型excel文件
laravel excel 3.1版 laravel版本5.6 我在excel文件中有超过100000行的数据。我想将此数据导入我的数据库 在My controller.php中使用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
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可以从一个特定的行开始,这在开发过程中很有用,但在这个示例中没有明确的必要。谢谢!我在找那个。很好用,很高兴能帮上忙。