一对一关联的users与doctors表插入数据时如何传递user_id?
问题:一对一关联表插入数据时触发外键约束错误
表结构
Users _____________ | id | name | |____|______| | 1 | John | |____|______| Doctors _____________________ | id | dep | user_id | |____|_____|_________| | 1 | 2 | 1 | |____|_____|_________|
模型关联定义
User模型中已定义一对一关联:
public function doctor(){ return $this->hasOne(Doctor::class); }
插入代码及错误
使用以下代码插入数据时:
$valdiated = $request->validated(); $userData = [ 'name' => $valdiated['name'], ]; $doctorData = [ 'dep' => $valdiated['dep'], ]; $newUser = new User(); $newUser->insert($userData); $newUser->doctor()->insert($doctorData);
触发外键约束错误:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`db`.`doctors`, CONSTRAINT `doctors_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) (SQL: insert into `doctors` (`dep`) values (2))
提问:是否有办法自动将user_id插入doctors表,还是必须查询数据库获取最后插入的ID?
解决方案
不需要手动查询最后插入的ID,利用Eloquent的关联方法可以自动填充外键,推荐以下两种正确方式:
方式一:使用模型的create方法(优先推荐)
insert是批量插入方法,不会返回带ID的模型实例,也不会触发模型事件。改用create方法可以获取保存后的用户模型,调用关联的create时,Eloquent会自动将当前用户的ID填充到doctors表的user_id字段:
$validated = $request->validated(); // 创建用户并返回带ID的模型实例 $newUser = User::create([ 'name' => $validated['name'], ]); // 自动填充user_id并创建医生记录 $newUser->doctor()->create([ 'dep' => $validated['dep'], ]);
方式二:手动获取插入ID(不推荐)
如果一定要用insert方法,需要手动获取插入后的用户ID,但这种方式存在并发风险(多请求同时插入时可能拿到错误ID),示例代码:
$validated = $request->validated(); // 插入用户 User::insert([ 'name' => $validated['name'], ]); // 获取最后插入的用户ID $userId = DB::getPdo()->lastInsertId(); // 或者用 $userId = User::latest('id')->value('id'); // 插入医生记录并手动指定user_id Doctor::insert([ 'dep' => $validated['dep'], 'user_id' => $userId, ]);
内容的提问来源于stack exchange,提问作者mmdev
相关产品推荐
相关产品推荐

