Laravel 9控制器中外键的使用方法咨询
实现UserInfoController中外键关联的操作方法
第一步:先搞定实体类的外键映射(Controller依赖的基础)
假设你用的是Spring Data JPA,先在UserInfo实体类中配置与User的关联:
@Entity @Table(name = "user_info") public class UserInfo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 配置外键关联,userid对应user表的id字段 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "userid", referencedColumnName = "id", nullable = false) private User user; // 其他业务字段 private String address; private String phone; // getter、setter、构造方法... } @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; // 可选:配置反向关联,方便从User查询UserInfo @OneToOne(mappedBy = "user", cascade = CascadeType.ALL) private UserInfo userInfo; // getter、setter、构造方法... }
这里@JoinColumn的name对应user_info表的外键字段userid,referencedColumnName指向user表的主键id,nullable = false强制外键不能为空。
第二步:Service层封装外键校验逻辑
外键约束要求userid必须对应user表中已存在的记录,所以把校验逻辑放在Service层,避免Controller直接处理数据库细节:
@Service public class UserInfoService { @Autowired private UserInfoRepository userInfoRepository; @Autowired private UserRepository userRepository; // 新增UserInfo时校验User是否存在 public UserInfo saveUserInfo(UserInfo userInfo) { if (!userRepository.existsById(userInfo.getUser().getId())) { throw new RuntimeException("关联的User不存在,无法创建UserInfo"); } return userInfoRepository.save(userInfo); } // 根据UserID查询关联的UserInfo public UserInfo getByUserId(Long userId) { return userInfoRepository.findByUser_Id(userId); // 若Repository定义了findByUserid方法,也可直接调用: // return userInfoRepository.findByUserid(userId); } // 更新UserInfo时校验关联User合法性 public UserInfo updateUserInfo(Long userId, UserInfo updatedInfo) { UserInfo existingInfo = userInfoRepository.findByUser_Id(userId); if (existingInfo == null) { throw new RuntimeException("该User对应的UserInfo不存在"); } if (!userRepository.existsById(updatedInfo.getUser().getId())) { throw new RuntimeException("目标User不存在"); } existingInfo.setAddress(updatedInfo.getAddress()); existingInfo.setPhone(updatedInfo.getPhone()); existingInfo.setUser(updatedInfo.getUser()); return userInfoRepository.save(existingInfo); } }
对应的UserInfoRepository需要定义查询方法:
public interface UserInfoRepository extends JpaRepository<UserInfo, Long> { UserInfo findByUser_Id(Long userId); // 或根据数据库字段名定义: // UserInfo findByUserid(Long userId); }
第三步:UserInfoController的具体实现
Controller只负责接收请求、调用Service、返回响应:
@RestController @RequestMapping("/user-info") public class UserInfoController { @Autowired private UserInfoService userInfoService; // 新增UserInfo @PostMapping public ResponseEntity<UserInfo> createUserInfo(@RequestBody UserInfo userInfo) { try { UserInfo savedInfo = userInfoService.saveUserInfo(userInfo); return ResponseEntity.ok(savedInfo); } catch (RuntimeException e) { return ResponseEntity.badRequest().body(null); } } // 根据UserID查询UserInfo @GetMapping("/{userId}") public ResponseEntity<UserInfo> getUserInfoByUserId(@PathVariable Long userId) { UserInfo userInfo = userInfoService.getByUserId(userId); return userInfo != null ? ResponseEntity.ok(userInfo) : ResponseEntity.notFound().build(); } // 更新UserInfo @PutMapping("/{userId}") public ResponseEntity<UserInfo> updateUserInfo(@PathVariable Long userId, @RequestBody UserInfo updatedInfo) { try { UserInfo updated = userInfoService.updateUserInfo(userId, updatedInfo); return ResponseEntity.ok(updated); } catch (RuntimeException e) { return ResponseEntity.badRequest().body(null); } } }
额外场景处理:前端仅传userid时
如果前端只传userid而非完整User对象,可在Controller中先查询User实体再关联:
@PostMapping public ResponseEntity<UserInfo> createUserInfo(@RequestBody Map<String, Object> request) { Long userId = Long.parseLong(request.get("userid").toString()); User user = userRepository.findById(userId) .orElseThrow(() -> new RuntimeException("User不存在")); UserInfo userInfo = new UserInfo(); userInfo.setUser(user); userInfo.setAddress(request.get("address").toString()); userInfo.setPhone(request.get("phone").toString()); try { UserInfo savedInfo = userInfoService.saveUserInfo(userInfo); return ResponseEntity.ok(savedInfo); } catch (RuntimeException e) { return ResponseEntity.badRequest().body(null); } }
内容的提问来源于stack exchange,提问作者Babi
相关产品推荐
相关产品推荐

