Laravel:实施一对一的关系

时间:2016-11-29 22:09:29

标签: laravel laravel-5

我正在Laravel 5中创建一个应用程序。

我创建的应用是一个招聘网站,候选人必须填写多种表格。因为有很多字段,所以我决定将users表逻辑分区为许多较小的表,并且具有一对一的关系。

例如,两个这样的表可能如下所示:

用户

  • ID
  • 角色(例如管理员或候选人)
  • 如first_name
  • DOB

driving_licences

  • ID
  • user_id(FK给用户)
  • has_licence
  • NUMBER_OF_POINTS
  • licence_number

在上述简单案例中,usersdriving_licences的关系具有一对一关系。换句话说,每个User模型必须有一个对应的DrivingLicence模型。

创建上表和相应的Eloquent模型非常简单。但是,我正在努力强制执行每个用户(或每个候选用户)都有相应的DrivingLicence的最佳方法。

我目前的解决方案是,每当我使用DrivingLicence中的内容时,我首先检查关系是否存在,如果它不是这样的话,请创建它:

if ($user->drivingLicence === null) {
    $drivingLicence = new DrivingLicence();
    $drivingLicence->user_id = $user->id;
    $drivingLicence->save();
}

每次我需要对DrivingLicence做一些事情时都必须这样做,这当然会造成很多重复。

因此,我的问题是,如何强制执行Laravel中usersdriving_licences之间的一对一关系。

1 个答案:

答案 0 :(得分:0)

我认为强制用户拥有许可证首先是错误的目标。用户完全有可能没有驾驶执照,而不是使用has_license字段来表示,只是不为他们创建驾驶执照。

在现实世界中考虑它。没有驾驶执照的人也没有卡片说他们没有驾驶执照。这基本上就是您使用当前数据库模式进行建模的内容。相反,他们只是没有任何东西,所以省略driving_licenses记录。

您的User模型可以使用hasDrivingLicense()这样的方法,具有以下实现:

public function hasDrivingLicense()
{
    return $this->drivingLicense !== null;
}

我意识到这并没有回答你的直接问题,但这对我来说是一种代码味道。