微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在同一个控制器中两次使用 Maatwebsite/Laravel-ExcelExcel 实例

如何解决如何在同一个控制器中两次使用 Maatwebsite/Laravel-ExcelExcel 实例

我正在尝试在导入数据之前读取 excel 表以实现类似这样的逻辑

if(count($imagesNames) > 0) {
            $collection = Excel::toCollection(
                new UserImport,public_path('uploads/' . $usersFileName)
            );

            $excelImagesNames = $collection[0]->pluck('image')->toArray();
            $diffArray = array_diff($imagesNames,$excelImagesNames);
            if(count($diffArray) > 0){
                return $this->response->error('Uploaded images and user images in excel file are not the same.',null,400);
            }
        }

        Excel::import(
            new UsersImport(
                $entity,$user,$request->get('unique_fields'),$request->get('update_duplicates'),new JobHistory,),public_path('uploads/'.$usersFileName),\Maatwebsite\Excel\Excel::XLSX
        );

用户导入

class UserImport implements ToModel,WithheadingRow
{
  public function model(array $row)
  {
      return new User(array_map(function($v) {
          return str_replace("'",'',$v);
      },$row));
  }
}

UsersImport 包含整个导入逻辑(这只是其中的一部分)

class UsersImport implements ToCollection,WithValidation,WithheadingRow,WithChunkReading,ShouldQueue,WithEvents
{
private $entity,$updateDuplicates,$uniqueFields,$jobHistory;

public function __construct(Entity $entity,User $user,array
$uniqueFields,string $updateDuplicates,JobHistory $jobHistory)
{
    $this->entity = $entity;
    $this->user = $user;
    $this->updateDuplicates = $updateDuplicates;
    $this->uniqueFields = $uniqueFields;
    $this->jobHistory = $jobHistory;
}

public function collection(Collection $rows)
{
    foreach ($rows as $row) {
        $data = $row->toArray();
        array_walk($data,array($this,'parseData'));

        if ($this->updateDuplicates !== null) {

            $user = User::uniqueFields($this->uniqueFields,$data);

            if ($user->count() > 0 && $this->updateDuplicates) {
                $user->update($data);
                continue;
            } elseif (!$this->updateDuplicates) {
                continue;
            }
        }

        User::create($data);
    }
}

因此,如果用户上传图像文件夹,它将开始检查图像列是否在提取的图像文件夹中包含相同名称的图像。如果一切正常,它将开始导入 excel 文件并将数据插入数据库,但我得到

serialize(): "spreadsheet" returned as member variable from __sleep() but does not exist

如果我删除 Excel::import 代码错误不会显示但确定它不会导入数据,如果我保留此导入逻辑并删除 Collection 部分,导入工作正常如果我是对的,我想它不能像这样一个一个地运行 2 个队列。为什么会出现这个错误以及如何根据我的逻辑修复它?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。