如何在Laravel中将Excel数据与文本输入框值一同插入数据库
Excel导入同步插入表单额外字段实现方案
核心实现逻辑
通过构造函数将表单提交的额外参数(本例为price)注入到Import类中,避免在Import类内直接全局调用request,降低耦合,适配不同场景的参数传递需求。
1. 修正Blade表单(必须加文件上传的enctype属性)
<!-- 表单必须添加enctype="multipart/form-data" 否则无法正常上传文件 --> <form method="POST" action="{{ route('your.upload.route') }}" enctype="multipart/form-data"> @csrf <input type="text" name="price" /> <input type="file" name="bulk_file" /> <button type="submit">导入</button> </form>
2. 修改Controller代码
将表单获取的price参数通过构造函数传递给ProductsImport实例,可提前加参数校验提高稳定性:
public function bulk_upload(Request $request) { // 提前做参数合法性校验 $request->validate([ 'price' => 'required|numeric', 'bulk_file' => 'required|file|mimes:xlsx,xls,csv' ]); if($request->hasFile('bulk_file')){ // 把price参数传入ProductsImport构造函数 $import = new ProductsImport($request->input('price')); Excel::import($import, $request->file('bulk_file')); } return back(); }
3. 修改ProductsImport类代码
新增私有属性接收price参数,新增构造函数赋值,入库时直接使用该属性,同时删除冲突的ToModel接口(ToCollection和ToModel不可同时使用):
class ProductsImport implements ToCollection, WithHeadingRow, WithValidation { private $rows = 0; // 新增私有属性存储传入的price private $price; // 新增构造函数接收参数 public function __construct($price) { $this->price = $price; } public function collection(Collection $rows) { $canImport = true; if($canImport) { foreach ($rows as $row) { $productId = Product::create([ 'name' => $row['name'], 'added_by' => Auth::user()->user_type == 'seller' ? 'seller' : 'admin', 'user_id' => Auth::user()->user_type == 'seller' ? Auth::user()->id : User::where('user_type', 'admin')->first()->id, 'category_id' => 24, 'brand_id' => !empty($row['brand_id']) ? $row['brand_id']: 0, // 使用传入的price属性,修正原代码的语法错误(多余分号) 'price' => $this->price ]); } flash(translate('Products imported successfully'))->success(); } } // 原有校验规则等其他代码保持不变 }
内容的提问来源于stack exchange,提问作者Jahidul Islam
相关产品推荐
相关产品推荐

