立即注册 找回密码

QQ登录

只需一步,快速开始

查看: 223|回复: 1
打印 上一主题 下一主题

laravel excel3.1用构造函数传递数组分批导入

[复制链接]
晚上记录一下,其实不需要这样做的,只为了明白构造函数用法。模型都在app/models/目录下,有两个:
LssjImport.php
  1. namespace App\Models;

  2. use App\Models\LssjbModel;
  3. use Maatwebsite\Excel\Concerns\ToModel;
  4. use Maatwebsite\Excel\Concerns\WithBatchInserts;
  5. use Maatwebsite\Excel\Concerns\WithChunkReading;
  6. use Maatwebsite\Excel\Concerns\WithHeadingRow;

  7. class LssjImport implements ToModel, WithBatchInserts, WithChunkReading, WithHeadingRow{
  8. ? ?? ?/*
  9. 构造函数
  10. 属性声明是由关键字 public,protected 或者 private 开头,然后跟一个普通的变量声明来组成。
  11. 属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指 PHP 脚本在编译阶段时就可以得到其值,而不依赖于运行时的信息才能求值。
  12. 所以protected $table = 'bgsx'可以,但protected $table=$bm就出错。必须用构造函数赋值。? ?
  13. ? ???*/
  14. ??
  15. ? ? protected $zd;//创建属性
  16. ? ? public function __construct($zdm)//接收控制器变量bm,在函数内部通过func_get_args()函数就可以取得所有传入的参数
  17. ? ? {
  18. ? ?? ???$this->zd = $zdm;//赋值给zd
  19. ? ?? ???//dd($zdm);
  20. ? ? }
  21. ? ?
  22. ? ? public function model(array $row)
  23. ? ? {
  24. ? ? ? ? ? ? ? ? foreach ($this->zd as $val){
  25. ? ? ? ? ? ? ? ? ? ? ? ? $zdsz[$val] = $row[$val];
  26. ? ? ? ? ? ? ? ? }
  27. //dd($zdsz);
  28. ? ?? ???return new LssjbModel($zdsz);
  29. ? ? }

  30. ? ? //批量导入1000条
  31. ? ? public function batchSize(): int? ? {
  32. ? ?? ???return 1;
  33. ? ? }
  34. ? ? //以1000条数据基准切割数据
  35. ? ? public function chunkSize(): int? ? {
  36. ? ?? ???return 1;
  37. ? ? }
  38. ? ?
  39. }
复制代码
LssjbModel.php
  1. namespace App\Models;

  2. use Illuminate\Database\Eloquent\Model;
  3. use Encore\Admin\Facades\Admin;

  4. class LssjbModel extends Model
  5. {
  6. ? ? protected $table = 'lssjb';
  7. ? ? protected $guarded = [];//禁止批量赋值的字段
  8. ? ? public $timestamps = false;//禁用自动创建时间
  9. }
复制代码
控制器Admin/Controllers/ImportController.php
  1. namespace App\Admin\Controllers;

  2. use App\Models\LssjImport;
  3. use Maatwebsite\Excel\Facades\Excel;
  4. use App\Http\Controllers\Controller;
  5. use Maatwebsite\Excel\HeadingRowImport;
  6. use Maatwebsite\Excel\Imports\HeadingRowFormatter;
  7. HeadingRowFormatter::default('none');//不格式化标题数据

  8. class ImportController extends Controller
  9. {
  10. ? ? public function import()
  11. ? ? {
  12. ? ?? ???$zdm = (new HeadingRowImport)->toArray('aa.xls')[0][0];//标题行
  13. ? ? ? ? ? ? ? ? //dd($zdm);
  14. ? ? ? ? ? ? ? ? Excel::import(new LssjImport($zdm), 'aa.xls');//$zdm用构造函数传递给MODEL
  15. ? ?? ???//return redirect('/')->with('success', 'All good!');
  16. ? ? }
  17. }
复制代码


哎...今天够累的,签到来了...
沙发
?楼主| 发表于 2019-9-25 14:13:31 | 只看该作者
不使用构造函数的导入,成品:
Admin.tar.gz (4.16 KB, 下载次数: 2)
Models.tar.gz (1.53 KB, 下载次数: 2)
哎...今天够累的,签到来了...
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|Archiver|梦飞文学网 ( 赣ICP备15004458号-1 )???

GMT+8, 2019-11-4 16:07365在线滚球程序 , Processed in 0.075623 second(s), 30 queries .

Powered by Discuz! X3.4 ? 2001-2013 Comsenz Inc & yjwx

快速回复 返回顶部 返回列表