【问题标题】:How to update existing data from import CSV ? with laravel如何从导入 CSV 更新现有数据?与 laravel
【发布时间】:2021-03-10 07:57:21
【问题描述】:

我在 laravel 中使用 MaatWesbite 包导入 csv 有一些问题,如何使用导入 CSV 更新现有数据??

这是我的控制器:

public function storeData(Request $request)
{
    $this->validate($request, [
        'file' => 'required|mimes:csv,txt'
    ]);

    // $date = new DateTime;
    $exchange_rate = new ExchangeRate();
    if ($request->hasFile('file')) {
        $file = $request->file('file');
        $nama_file = date('Y-m-d').$file->getClientOriginalName();
        $destinasi = 'public/kurs/';
        $file->move($destinasi, $nama_file);
        Excel::import(new ExchangeRateImport, public_path('/public/kurs/' . $nama_file));

        Display::where('display_type', ExchangeRate::class)
            ->where('display_id', $exchange_rate->id)
            ->delete();

        if (isset($request->device)) {
            foreach ($request->device as $device) {
                $display = new Display();
                $display->device_id = $device;
                $display->display_type = ExchangeRate::class;
                $display->display_id = $exchange_rate->id;
                $display->save();
            }
        }
    }

    return redirect()->route('signage.exchange-rate.index')->with('success', __('backend.exchange_rate') . __('backend.added'));
}

这是我的模型:

<?php

namespace App\Models\Signage;

use Illuminate\Database\Eloquent\Model;

class ExchangeRate extends Model
{
    protected $table = 'signage_exchange_rates';

    protected $fillable = [
        'country', 'type', 'bank_buy', 'bank_sell'
    ];
}

这是我的导入功能:

<?php

namespace App\Imports;

use App\Models\Signage\Exchangerate;
use Maatwebsite\Excel\Row;
use Maatwebsite\Excel\Concerns\OnEachRow;


class ExchangeRateImport implements OnEachRow
{
    public function onRow(Row $row)
    {
        $row = $row->toArray();

        if (!isset($row[0])) {
            return null;
        }
        
        $exchange = ExchangeRate::updateOrCreate([
            'country' => preg_replace("/[^a-zA-Z0-9]/", "", $row[0]),
            'type' => $row[1],
            'bank_buy' => $row[2],
            'bank_sell' => $row[3],
        ]);

        if (! $exchange->wasRecentlyCreated) {
            $exchange->update([
                'country' => preg_replace("/[^a-zA-Z0-9]/", "", $row[0]),
                'type' => $row[1],
                'bank_buy' => $row[2],
                'bank_sell' => $row[3],
            ]);
        }
    }
}

我已经这样做了,但是当导入成功时,csv 不会替换现有数据总是插入新数据。

【问题讨论】:

    标签: php database laravel import maatwebsite-excel


    【解决方案1】:

    也许我来得太晚了,但是这个包有他自己的 Upserts(更新或插入)。

    您的 ExchangeImport 文件如下所示:

    
    namespace App\Imports;
    
    use App\Models\Signage\Exchangerate;
    use Maatwebsite\Excel\Row;
    use Maatwebsite\Excel\Concerns\OnEachRow;
    use Maatwebsite\Excel\Concerns\WithUpserts;
    
    class ExchangeRateImport implements OnEachRow, WithUpserts
    {
    
        /**
         * @return string|array
         */
        public function uniqueBy()
        {
            return 'country';
        }
    
        /**
        * @param array $row
        *
        * @return \Illuminate\Database\Eloquent\Model|null
        */
        public function model(array $row)
        {
            return new ExchangeRate([
                'country' => preg_replace("/[^a-zA-Z0-9]/", "", $row[0]),
                'type' => $row[1],
                'bank_buy' => $row[2],
                'bank_sell' => $row[3],
            ]);
        }
    }
    

    【讨论】:

      【解决方案2】:

      在 laravel 文档 UpdateOrCreate 上查看此链接: 因此,在您的 updateOrCreate 方法中,您必须添加一个额外的数组(第一个数组)来帮助模型查找模型是否存在,例如:

      $exchange = ExchangeRate::updateOrCreate(
              ['identifier_of_model' => $identifier_of_model],
              [
                  'country' => preg_replace("/[^a-zA-Z0-9]/", "", $row[0]),
                  'type' => $row[1],
                  'bank_buy' => $row[2],
                  'bank_sell' => $row[3],
              ]);
      

      【讨论】:

      • 意思是 "['identifier_of_model' => $identifier_of_model]" = "['country' => $row[0]" ??
      • 'identifier_of_model' 表示例如主键,用于检查该行是否存在于数据库中。如果存在需要更新,否则需要创建。
      猜你喜欢
      • 2020-04-30
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 2021-10-08
      • 2018-03-20
      • 1970-01-01
      相关资源
      最近更新 更多