【问题标题】:Access variable outside of Excel::load in Laravel在 Laravel 中访问 Excel::load 之外的变量
【发布时间】:2017-06-01 17:30:43
【问题描述】:

我想问一下,当我在 Excel::load 函数中执行 foreach 循环时,我是否可以访问错误消息变量,该函数读取我上传的 csv 文件,以便我可以通过 Response:: 返回它json();

这是我的代码:

$errorMessage['error'] = [];

        if($request->hasFile('file')){
            if($request->file('file')->getClientOriginalExtension() != "csv"){
                $errorMessage['error'][] = "File should be in csv format";
            }
            else {

                $fileName = $request->file('file')->getClientOriginalName().".csv";
                $destination = base_path().'/storage/excel/imports';
                $request->file('file')->move($destination, $fileName);

                $csvFile = base_path().'/storage/excel/imports/'.$fileName;

                $demographics = $request->get('demographics');

                \Excel::load($csvFile, function($reader) use($demographics,$errorMessage) {
                        if($demographics == "region"){
                            foreach($reader->get()->toArray() as $data){
                                $region = Region::whereRaw("LCASE(`short_name`) = ?", array(strtolower($data['region_name'])))->first();
                                if($region){
                                    $regionData = Region::find($region->id);
                                    $regionData->total_number_of_provinces = $data['total_provinces'];
                                    $regionData->total_number_of_cities_municipalities = $data['total_cities_and_municipalities'];
                                    $regionData->save();

                                }
                                else {
                                    $errorMessage['error'][] = $data['region_name'] . " is not existing in the database";
                                }
                            }
                        }

                });
            }
        }
        else {
            $errorMessage['error'][] = "Please specify a file";
        }

        return \Response::json($errorMessage);

【问题讨论】:

    标签: php laravel laravel-excel


    【解决方案1】:

    有点臭,但你可以将它声明为类属性。

    /**
    * @var array
    */
    protected $errorMessage;
    
    public function doStuff()
    {
        // ...
    
        \Excel::load($file, function($reader) use ($demographics) {
    
            // ...
    
            $this->errormessage['error'][] = $data['region_name'];
        });
    
        // ...
    
        return \Response::json($this->errorMessage);
    }
    

    注意

    您也可以通过引用传递$errorMessage,很多人认为这是更好的选择(毕竟您使用的是一次性函数)。

    \Excel::load($file, function($reader) use ($demographics, &$errorMessage)
    

    然而,我不喜欢这样做,因为在我看来,我的意思是不那么可读。不过,您可以选择其中一个!

    有用且简短的解释:http://culttt.com/2013/03/25/what-are-php-lambdas-and-closures/

    【讨论】:

      【解决方案2】:
         $fileName = md5(time()) .'.'.$request->file('file')->getClientOriginalExtension();
         $sheet_id  = $request->session()->get('sheet_id');
         $excel=Excel::load(public_path('/uploads/importsheet/'.$fileName),function ($reader)use ($sheet_id) {
      
              $reader->each(function($sheet) use ($sheet_id) {                                                
                  $headings = $sheet->keys()->toArray();              
                  for($i=0; $i<count($headings); $i++){
                      $sheet_id = DB::table('import_sheets_attributes')->insertGetId(
                          [
                              'import_sheets_id' => $sheet_id,
                              'attribute'  => $headings[$i],
                              'created_at' => date('Y-m-d H:i:s'),
                              'updated_at' => date('Y-m-d H:i:s')
                          ]);
                  }        
              });
          });
      

      希望以上示例代码对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-28
        • 2020-06-22
        • 2014-07-18
        • 1970-01-01
        • 1970-01-01
        • 2018-06-30
        • 1970-01-01
        • 2021-07-23
        相关资源
        最近更新 更多