如何从导入 CSV 更新现有数据? laravel
How to update existing data from import CSV ? with laravel
我在 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 不会替换现有数据总是插入新数据。
在 laravel 文档 UpdateOrCreate 上查看此 link:
因此,在您的 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],
]);
也许我来得太晚了,但是这个包有他自己的 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],
]);
}
}
我在 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 不会替换现有数据总是插入新数据。
在 laravel 文档 UpdateOrCreate 上查看此 link: 因此,在您的 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],
]);
也许我来得太晚了,但是这个包有他自己的 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],
]);
}
}