首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果导入csv - Laravel刀片中只存在一条记录,则出现Foreach错误

如果导入csv - Laravel刀片中只存在一条记录,则出现Foreach错误
EN

Stack Overflow用户
提问于 2020-06-15 07:59:40
回答 1查看 147关注 0票数 0

我有一个导入功能,用户可以从.csv文件导入记录。如果用户正在导入一个包含多条记录的文件,那么它工作得很好,但是如果试图导入一个只有一条记录的.csv,它会抛出一个错误,"Invalid argument supplied for foreach()“,并显示该错误的引用代码。

代码语言:javascript
运行
复制
<?php $__currentLoopData = $line; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $field): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>

如上所述,只有在导入.csv中只有一条记录时,才会发生此错误,如果要向导入功能的.csv中添加其他记录,则该过程工作正常。

这是刀片的foreach代码,是怎么回事?

代码语言:javascript
运行
复制
<table class="table">
 @if (isset($headers))
     <tr>
       @foreach ($headers as $field)
           <th>{{ $field }}</th>
       @endforeach
      </tr>
 @endif
 @if($lines)
     @foreach ($lines as $line)
      <tr>
       @foreach ($line as $field)
           <td>{{ $field }}</td>
       @endforeach
      </tr>
     @endforeach
 @endif
     <tr>
         @foreach ($headers as $key => $header)
           <td>
              <select name="fields[{{ $key }}]">
                 <option value=''>Please select</option>
                     @foreach ($fillables as $k => $fillable)
                        <option value="{{ $fillable }}"
                            @if (strtolower($header) === strtolower($fillable)) selected @endif>{{ $fillable  }}</option>
                     @endforeach
              </select>
           </td>
      @endforeach
    </tr>
  </table>

这是控制器

代码语言:javascript
运行
复制
public function parse(Request $request)
    {
        $file = $request->file('csv_file');
        $request->validate([
            'csv_file' => 'mimes:csv,txt',
        ]);

        $path = $file->path();
        $hasHeader = $request->input('header', false) ? true : false;

        $reader = new SpreadsheetReader($path);
        $headers = $reader->current();
        $lines = [];
        $lines[] = $reader->next();
        $lines[] = $reader->next();

        $filename = Str::random(10).'.csv';
        $file->storeAs('csv_import', $filename);

        $modelName = $request->input('model', false);
        $fullModelName = 'App\\'.$modelName;

        $model = new $fullModelName();
        $fillables = $model->getFillable();

        $church_id = $request->input('church_id');
        $interest_tags = $request->input('interest_tags');

        if ($modelName == 'Interest') {
            $custom_fields = CustomField::where('created_by_team_id', $church_id)->pluck('name')->toArray();
            if (! empty($custom_fields)) {
                $fillables = array_merge($fillables, $custom_fields);
            }
        }

        $is_adding_new_religious_background = $request->input('is_adding_new_religious_background', false) ? true : false;

        $redirect = url()->previous();

        return view(
            'csvImport.parse_import',
            compact('headers', 'filename', 'fillables', 'church_id', 'interest_tags', 'hasHeader', 'modelName', 'lines', 'redirect', 'is_adding_new_religious_background')
        );

如何修改它,使其同时适用于单记录导入和多记录导入?

EN

Stack Overflow用户

发布于 2020-06-15 08:28:35

我认为您必须检查刀片模板中的第二个@foreach。需要在循环前检查$line是否为空。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62379528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档