Laravel使用Maatwebsite Excel导入时如何绑定视图选择的额外外键字段
解决方案
你可以通过给导入类添加构造方法的方式,把表单提交的project_id和site_id传入导入逻辑,直接映射到每条导入数据中,具体修改步骤如下:
1. 修改导入类ProposalsImport
新增私有属性存储两个外键值,通过构造方法接收参数,写入模型创建逻辑:
namespace App\Imports; use App\Proposal; use Maatwebsite\Excel\Concerns\ToModel; use Maatwebsite\Excel\Concerns\WithHeadingRow; class ProposalsImport implements ToModel, WithHeadingRow { // 新增两个私有属性存储外键 protected $project_id; protected $site_id; // 构造方法接收传入的参数 public function __construct($project_id, $site_id) { $this->project_id = $project_id; $this->site_id = $site_id; } public function model(array $row) { return new Proposal([ 'building' => $row['building'], 'floor' => $row['floor'], 'area' => $row['area'], 'room' => $row['room'], 'luminaire' => $row['luminaire'], 'actual_qty' => $row['actual_qty'], 'installed_qty' => $row['installed_qty'], // 加入两个外键字段 'project_id' => $this->project_id, 'site_id' => $this->site_id, ]); } }
2. 修改控制器处理逻辑
你的表单提交路由是proposals.store,所以需要在对应的控制器方法中(注意不是你示例中的import方法,是store方法)接收表单参数,传入导入类:
use Illuminate\Http\Request; use Maatwebsite\Excel\Facades\Excel; use App\Imports\ProposalsImport; // 对应表单提交的store方法 public function store(Request $request) { // 先验证提交参数 $validated = $request->validate([ 'project_id' => 'required|exists:projects,id', 'site_id' => 'required|exists:sites,id', 'proposal_file' => 'required|file|mimes:xlsx,xls,csv', ]); // 把选中的两个外键传入导入类,执行导入 Excel::import( new ProposalsImport($validated['project_id'], $validated['site_id']), $request->file('proposal_file') ); // 导入完成后返回提示 return back()->with('status', '数据导入成功'); }
修改完成后所有从Excel导入的行都会自动带上表单选中的project_id和site_id,无需改动现有视图代码。
内容的提问来源于stack exchange,提问作者Inno
相关产品推荐
相关产品推荐

