使用 laravel 用 csv 更新 table

update table with csv using laravel

我正在尝试使用 Maatwebsite/Laravel-Excel 更新 table。

public function import(Request $request)
{
  if($request->file('imported-file'))
  {
            $path = $request->file('imported-file')->getRealPath();
            $data = Excel::load($path, function($reader)
      {
            })->get();

      if(!empty($data) && $data->count())
      {
        foreach ($data->toArray() as $row)
        {
          if(!empty($row))
          {
            $dataArray[] =
            [
              //'name' => $row['name'],
              'age' => $row['age'],
              'phone' => $row['phone'],
              //'created_at' => $row['created_at']
            ];
          }
          if(!empty($dataArray))
            {
                //Item::insert($dataArray);
                DB::table('items')
                ->where('name', $row['name'])->update($dataArray);

                return view('imported')->with('success', 'Course updated');
            }
      }

     }
   }
}

但是给出错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column '0' in 'field list' (SQL: update items set 0 = 20 where name = james

这是我的 csv

name,age,phone
James,20,888839939
Joseph,54,3444444
Hanson,30,99999999

以上是我正在尝试更新的 csv 文件。

问题是 $dataArray 是一个数组数组,所以要让它工作,你必须循环每个数组:

if(!empty($dataArray)) {
    foreach ($dataArray as $array) {
        DB::table('items')
            ->where('name', $row['name'])
            ->update($array);
    }

    return view('imported')->with('success', 'Course updated');
}

但这没有多大意义,因为每次它都会用 name = $row['name'] 更新行,所以你可能需要将您设置值的行更新为 $dataArray$dataArray[] = ...$dataArray = ...*,所以它可以有一个值。

万一有人遇到这个问题,我就是这样解决的。

public function import(Request $request)
    {
      if($request->file('imported-file'))
      {
                $path = $request->file('imported-file')->getRealPath();


                Excel::load($path)->each(function (Collection $csvLine) {


                    DB::table('items')
                        ->where('id', $csvLine->get('id'))
                        ->update(['name' => $csvLine->get('name'),'phone' => $csvLine->get('phone'),'age' => $csvLine->get('age')]);

               });
               return view('imported')->with('success', 'Course updated');


       }
    }

我使用 each() 收集方法循环遍历 csv 文件并赢得了战斗。