laravel-admin1.8第二讲,导入按钮

本文介绍了在laravel-admin1.8中如何实现Excel导入功能。首先,文章提到了需要安装相关依赖以支持Excel操作。接着,详细讲解了如何创建导入按钮,并在`Admin/Actions/Post/ImportPost.php`中修改代码,调用`DanganImport`类。在`app/Imports/DanganImport.php`中,自定义了验证规则并确保在Model的dangan类中添加了$fillable字段。此外,文章还强调在DanganController的grid方法中添加相应代码,允许导入文件,并提示数据字段可设为NULL以避免导入错误。最后,指出php.ini配置中需开启fileinfo扩展,以确保功能正常运行。

依赖

导入基本上都是excel进行导入,所以我们需要使用excel的相关依赖,大家可以使用自己熟悉的,我是按照我熟悉的依赖。

composer require maatwebsite/excel

在这里插入图片描述

创建导入按钮

php artisan admin:action Post\\ImportPost --name="导入数据"
App\Admin\Actions\Post\ImportPost created successfully.

也可以试着使用helpers执行命令。

我这里举一个例子,我们的数据结构是:

CREATE TABLE `dangan` (
  `id` int(10) UNSIGNED NOT NULL,
  `laiwendanwei` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `daizi` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `wenhao` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `nianfen` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `biaoti` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `qianfaren` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `mijidengji` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `shoufadate` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `yeshu` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `fenshu` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `beizhu` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `xuhao` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '序号',
  `zhengwenneirong` text COLLATE utf8mb4_unicode_ci COMMENT '正文内容',
  `wenjianfujian` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文件附件',
  `chengbandanwei` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `banlijiesuan` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `api` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `status` char(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ALTER TABLE `dangan`
  ADD PRIMARY KEY (`id`);

我们在生成的Admin/Actions/Post/ImportPost.php中修改代码

namespace App\Admin\Actions\Post;

use App\Imports\DanganImport;
use Encore\Admin\Actions\Action;
use Illuminate\Http\Request;

class ImportPost extends Action
{
    public $name = '导入文件';

    protected $selector = '.import-post';

    public function handle(Request $request)
    {
        $import = new DanganImport();
        $import->import($request->file('file'));

        $str = '';
        foreach ($import->failures() as $failure) {
            $str .=  ' 第'. $failure->row() . '行 失败原因:' . implode(' ', $failure->errors()) . '<br> 行数据:' . implode(' ', $failure->values()). '<br>';
        }
        if ($str !== '') {
            return $this->response()->error($str)->topFullWidth()->timeout(7000000);
        }

        return $this->response()->success('数据导入成功!')->refresh();
    }

    public function form()
    {
        $this->file('file', 'Please select file')->rules('required', ['required' => '文件不能为空']);
    }

    public function html()
    {
        return <<<HTML
        <a class="btn btn-sm btn-default import-post"><i class="fa fa-upload"></i>导入文件</a>
HTML;
    }
}

其中需要注意的是DanganImport(),这个是我们调用的导入类。
我们创建这个类文件app/Imports/DanganImport.php,代码如下:

namespace App\Imports;

use App\Models\Dangan;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\SkipsFailures;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithStartRow;
use Maatwebsite\Excel\Concerns\WithValidation;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;

class DanganImpost implements ToModel, WithStartRow, WithValidation, WithMultipleSheets
{
    use Importable;
    use SkipsFailures;
    /**
     * @param array $row
     *
     * @return \Illuminate\Database\Eloquent\Model|null
     */
    public function model(array $row)
    {
        return new Dangan([
            //按照excel单元顺序定义需要的字段
            'laiwendanwei' => $row[0],
            'daizi' => $row[1],
            'wenhao' => $row[2],
            'nianfen' => $row[3],
            'biaoti' => $row[4],
            'qianfaren' => $row[5],
            'mijidengji' => $row[6],
            'shoufadate' => $row[7],
            'yeshu' => $row[8],
            'fenshu' => $row[9],
            'beizhu' => $row[10],
            'xuhao' => $row[11],
            'zhengwenneirong' => $row[12],
            'wenjianfujian' => $row[13],
            'chengbandanwei' => $row[14],
            'banlijiesuan' => $row[15],
            'status' => $row[16],
        ]);
    }

    //从第几行开始
    public function startRow(): int
    {
        // TODO: Implement startRow() method.
        return 2;
    }

    //从哪个sheet开始
    public function sheets(): array
    {
        // TODO: Implement sheets() method.
        return [
            0 => new static,
        ];
    }

    //验证规则
    public function rules(): array
    {
        return [
            '0' => 'required',
        ];
    }

    // 自定义验证信息
//    public function customValidationMessages()
//    {
//        return [
//            '0.required' => '设备名必填',
//            '1.required' => '设备编号必填',
//            '2.required' => '设备型号必填',
//        ];
//    }

}

这里进行一下解释,自定义验证如果开放,则必须仔细写上,否则出错。

重点:在Model中dangan类必须加入一段字段代码:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Dangan extends Model
{
    protected $table = 'dangan';

    protected $fillable = ['laiwendanwei', 'daizi', 'wenhao', 'nianfen', 'biaoti', 'qianfaren', 'mijidengji', 'shoufadate', 'yeshu', 'fenshu','beizhu','xuhao','zhengwenneirong','wenjianfujian','chengbandanwei','banlijiesuan','api','status'];
}

$fillable这个必须添加,否则出错。具体为什么没看源代码反正这样就可以。

现在在DanganController中grid方法中加入代码:

// 将导入操作加入到表格的工具条中
$grid->tools(function (Grid\Tools $tools) {
    $tools->append(new ImportPost());
});

在这里插入图片描述
现在已经可以带入导入文件了,这里说明一下,数据字段都可以是NULL是为了不出错,否则一旦导入数据缺少就会出现报错,大家必须根据自己的需求进行设计。

补充:php.ini中必须开启fileinfo,否则错误。

导入按钮已经完成,如果还有什么问题可以私信。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈硕无敌

来吧,打赏我吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值