【问题标题】:Laravel: Enforcing one to one relationshipsLaravel:强制一对一的关系
【发布时间】:2016-11-29 22:09:29
【问题描述】:

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

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

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

用户

  • 身份证
  • 角色(例如管理员或候选人)
  • 名字
  • dob

driving_licences

  • 身份证
  • 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 之间存在一对一的关系。

【问题讨论】:

  • 这可能不是最好的方法,但可以让你走上正轨:在你的 User 模型中创建一个函数来检查许可证是否为空。如果是,请为用户创建并保存新许可证。 $user->checkLicense()。在checkLicense() 中检查null,创建或获取许可证,然后返回许可证。需要明确的是,这减少了不断重写许可证检查并将其移动到模型中的函数的需要。
  • 此外,“强制”所需许可证的一个想法是在用户创建时创建一个空许可证以在保存用户时保存。然后,您可以填写正确的数据。您将不再需要检查许可证是否存在,因为您将在创建用户时创建它。

标签: laravel laravel-5


【解决方案1】:

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

在现实世界的场景中考虑它。没有驾照的人也没有一张卡,上面写着他们没有驾照。这基本上就是您使用当前数据库模式建模的内容。相反,他们什么都没有,所以省略 driving_licenses 记录。

您的User 模型可以拥有诸如hasDrivingLicense() 之类的方法,并具有以下实现:

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

我意识到这并不能回答您的直接问题,但这在我看来有点代码味道。

【讨论】:

  • OK 是的,这个例子。但对于其他一些表,如 next_of_kindocuments,这很重要。
猜你喜欢
  • 1970-01-01
  • 2018-09-27
  • 2014-08-22
  • 2018-10-03
  • 2020-03-29
  • 2018-05-29
  • 2013-10-21
  • 1970-01-01
  • 2014-06-24
相关资源
最近更新 更多