Laravel导入Excel数据时如何绑定一对一/一对多/多对多关联关系?
可行实现方案
有两种成熟的实现方式,不需要单独开发关联表CRUD功能:
方案1:修改导入类逻辑(推荐,仅对本次导入生效)
注意你当前的UserImport代码存在逻辑冲突:使用WithConditionalSheets多工作表处理时,主导入类不需要实现ToModel接口,ToModel应该放在对应工作表的导入类(比如你导入学生数据的工作表对应的FirstSheetImport)中实现。
你只需要在对应工作表的model方法中,先创建并保存用户,再执行关联绑定即可:
// 对应学生工作表的导入类,比如FirstSheetImport use App\User; use App\Role; use Maatwebsite\Excel\Concerns\ToModel; class FirstSheetImport implements ToModel { // 提前查询Student角色ID,避免每行数据重复查询数据库 protected $studentRoleId; public function __construct() { $this->studentRoleId = Role::where('name', 'Student')->value('id'); } public function model(array $row) { // 创建并保存用户 $user = User::create([ 'nisn' => $row[1], 'nip' => $row[2], 'name' => $row[3], 'username' => $row[4], 'email' => $row[5], 'kelas' => $row[6], 'jabatan' => $row[7], 'tempat_lahir' => $row[8], 'tgl_lahir' => $row[9], 'bulan_lahir' => $row[10], 'tahun_lahir' => $row[11], 'jenis_kelamin' => $row[12], 'agama' => $row[13], 'tahun_masuk' => $row[14], 'no_telp' => $row[15], 'password' => $row[16], ]); // 绑定Student角色 $user->roles()->attach($this->studentRoleId); return $user; } }
调整后你原来的import_student控制器方法不需要做任何修改,调用一次就能完成数据导入+关联关系绑定。
方案2:使用模型创建事件(全局生效,所有新创建的学生自动绑定角色)
如果所有通过导入/后台新增的普通用户默认都是Student角色,你可以直接在User模型中绑定创建事件,后续不管在哪创建用户都会自动绑定角色:
// app/User.php protected static function boot() { parent::boot(); // 每次用户创建成功后自动执行 static::created(function ($user) { // 如果需要按用户类型绑定不同角色,可以在这里加判断逻辑 $studentRoleId = Role::where('name', 'Student')->value('id'); $user->roles()->attach($studentRoleId); }); }
这个方案下你不需要修改任何导入相关的代码,导入用户时会自动触发事件完成关联绑定。
内容的提问来源于stack exchange,提问作者TheBetweener
相关产品推荐
相关产品推荐

