返回

fastadmin批量导入的陷阱——导入失败?日期转换时间戳?日期早了8小时?二三级用户没批量导入权限?

后端

批量导入应该属于快速开发的省时方法,特别是针对于创建大量数据或者大量更新数据的情况,也防止了手动输入过程中的错误。当然,使用工具导入的过程中,也踩了不少坑,分享给大家:

  • 问题一:使用DateTime::createFromFormat时时区错了,导致日期早了8小时

原因:从数据库中读取日期时格式为datetime,而对于传入导入过程时,datetime类型很难直接导入。因此使用DateTime::createFromFormat进行日期转换。但是,根据fastadmin官方文档,说明中日期字符串格式为 [H:i:s [A]],即小时,分钟,秒(是否带上午和下午标记)。而mysql中规定HH:mm:ss才是小时、分钟、秒的表示方式。

解决:正确写成DateTime::createFromFormat('Y-m-d H:i:s','导入日期字符串')

  • 问题二:导入的数据全部导入失败

原因:导入设置不对,导致全部导入失败。

解决:在控制器的loadData方法中添加日志,导入成功和失败的都会打印出来,根据打印的字段名和导入字段名对比查看是不是少了某个字段或者字段名不对。

//data为Excel导出导入的数据
foreach ($data as $k => $v) {
    // 构建临时数据
    $row = [
        'username'  => $v['用户名'],
        'realname' => $v['真实姓名'],
        'mobile'  => $v['手机'],
        'user_group_id'  => $v['用户组'],
        'email'  => $v['邮箱'],
        'nickanme'  => $v['昵称'],
        'audit'  => $v['是否启用'],
        'level'  => $v['用户等级'],
        'score'  => $v['积分'],
        'money'  => $v['余额'],
        'jointime'  => $v['加入时间'],
        'remark'  => $v['备注'],
    ];
    try {
        // 将数据入库
        $ret = Db::name('user')->insert($row);
        if ($ret) {
            $this->success("第{$k}条数据插入成功");
        }
    } catch (\Exception $e) {
        $this->error("第{$k}条数据导入失败");
    }
}
  • 问题三:二三级用户没有导入权限

原因:可能是由于没有配置权限导致的,实际上这是一种权限设置问题。

解决:

  • 1、创建相应的管理员组和权限,用于控制数据导入。

  • 2、在用户的权限组中添加相应导入的权限,设置对应导入表的权限。

  • 问题四:导入时日期自动转换成时间戳

解决:

    //准备数据
    $record = $this->model;
    foreach ($rows as $row) {
        $record->save($row);
    }

在循环内直接插入数据会把日期转换成时间戳。而保存为记录实例再去保存则可以保证数据格式不变。

最后,网上教程有很多在PHP导入Excel数据的时候会提到fromArray()。但是经过测试,fromArray()数据导入在某些情况下是无法导入的,大家可以用上面的方法试一下。