如何在同一个控制器中两次使用 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 (将#修改为@)