【发布时间】:2021-03-27 07:00:47
【问题描述】:
我正在创建一个带有 GUI 的 Laravel 导入器。 所以,我有一个“ParseImport”功能:
public function parseImport(CsvImportRequest $request)
{
$path = $request->file('csv_file')->getRealPath();
if ($request->has('header')) {
$data = Excel::toArray([],request()->file('csv_file'))[0];
} else {
$data = array_map('str_getcsv', file($path));
}
if (count($data) > 0) {
if ($request->has('header')) {
$csv_header_fields = [];
foreach ($data[0] as $key => $value) {
$csv_header_fields[] = $key;
}
}
$csv_data = array_slice($data, 0, 2);
$csv_data_file = CsvData::create([
'csv_filename' => $request->file('csv_file')->getClientOriginalName(),
'csv_header' => $request->has('header'),
'csv_data' => json_encode($data)
]);
} else {
return redirect()->back();
}
return view('import_fields', compact( 'csv_header_fields', 'csv_data', 'csv_data_file'));
}
还有一个“ProcessImport”:
public function processImport(Request $request)
{
$data = CsvData::find($request->csv_data_file_id);
$csv_data = json_decode($data->csv_data, true);
foreach ($csv_data as $row) {
$item = new Item();
var_dump($item);
foreach (config('app.db_fields') as $index => $field) {
if ($data->csv_header) {
$item->$field = $row[$request->fields[$field]];
} else {
$item->$field = $row[$request->fields[$index]];
}
}
$item->save();
}
return view('import_success');
}
上传我的 csv 文件时:
并从我的 import_fields.blade.php 中选择我的 GUI 中的匹配字段:
<form class="form-horizontal" method="POST" action="{{ route('import_process') }}">
{{ csrf_field() }}
<input type="hidden" name="csv_data_file_id" value="{{ $csv_data_file->id }}" />
<table class="table">
@if (isset($csv_header_fields))
<tr>
@foreach ($csv_header_fields as $csv_header_field)
<th>{{ $csv_header_field }}</th>
@endforeach
</tr>
@endif
@foreach ($csv_data as $row)
<tr>
@foreach ($row as $key => $value)
<td>{{ $value }}</td>
@endforeach
</tr>
@endforeach
<tr>
@foreach ($csv_data[0] as $key => $value)
<td>
<select name="fields[{{ $key }}]">
@foreach (config('app.db_fields') as $db_field)
<option value="{{ (\Request::has('header')) ? $db_field : $loop->index }}"
@if ($key === $db_field) selected @endif>{{ $db_field }}</option>
@endforeach
</select>
</td>
@endforeach
</tr>
</table>
<button type="submit" class="btn btn-primary">
Import Data
</button>
</form>
进入我的数据库表 csv_data,我存储 csv 文件和数据。它工作正常,数据按原样存储:
但是当尝试将文件导入我的项目表时:
Var_dump($item) 给了我以下信息:
{ ["fillable"]=> array(13) {
[0]=> string(5) "title"
[1]=> string(11) "item_number"
[2]=> string(3) "ean"
[3]=> string(6) "active"
[4]=> string(5) "price"
[5]=> string(10) "cost_price"
[6]=> string(11) "offer_price"
[7]=> string(6) "teaser"
[8]=> string(11) "description"
[9]=> string(9) "inventory"
[10]=> string(5) "image"
[11]=> string(8) "brand_id"
[12]=> string(11) "category_id" }
你们中的任何人都可以看到我缺少什么吗?我似乎无法理解它。
【问题讨论】:
-
这意味着 $row 没有标题。 var_dump($row) 查看数据是什么。
-
Var_dump($row) 向我抛出这个:array(13) { [0]=> string(5) "title" [1]=> string(11) "item_number" [2]= > string(3) "ean" [3]=> string(6) "active" [4]=> string(5) "price" [5]=> string(10) "cost_price" [6]=> string (11) "offer_price" [7]=> string(6) "teaser" [8]=> string(11) "description" [9]=> string(9) "inventory" [10]=> string(5 ) "image" [11]=> string(8) "brand_id" [12]=> string(11) "category_id" } - 据我所知,标题是我的第一个索引。
-
所以这显示了标题。从数组中删除这一行,然后重试。这次你会得到第一行没有任何key的数据。
-
@BülentAkgül 我不确定你的意思是什么,你能解释一下要删除的位置和内容吗?对不起。
-
在下面查看我的答案。