mysql - Laravel 数据透视表需要有重复的条目
问题描述
我正在使用 Laravel 构建一个小型客户列表系统。
我需要将 COMPANY 与 CONTACT_PERSON 联系起来。在正常情况下,我可以使用多对多数据透视表来链接和更新它们。
但是,我需要保留历史记录。这意味着同一个人可以在较早的时期担任联系人,辞职,然后在另一个时期重新任命。
我尝试使用 phpMyAdmin 复制数据透视表条目,使相同的 COMPANY 链接相同的 CONTACT_PERSON 两次,并且在检索 COMPANY 记录时发现了两个条目。
但是,如何使用 Laravel 复制条目?如何使用 Laravel 来 CURD 那些。或者我只是以错误的方式做这件事?
非常感谢!
编辑:示例:
A 公司在 2001 年 1 月 1 日至 2001 年 2 月 2 日之间雇用了 A 先生,A 公司于 2001 年 3 月 3 日至 2001 年 4 月 4 日再次雇用了 A 先生。company表中有公司B,C,D ...,员工表中也有B先生,C先生,D先生。
使用 Laravel 关系数据透视表将公司 A 链接到 A 先生,在上述情况下会有两条记录(我需要有历史记录)。
使用 Laravel 多对多关系处理此类情况是否正确?还是我应该考虑其他方式?
解决方案
数据透视表可以包含其他列。您可以考虑添加将日期时间字段添加started_at
到resigned_at
数据透视表的迁移。
你的数据结构看起来像这样:
公司
- ID
- ...
Contact_person_company
- contact_person_id
- company_id
- 开始时间
- 辞职
联系人
- ID
- ...
之后,您可以在模型中创建函数来处理数据透视列并检查它们的状态。该列的空值resigned_at
表示 ContactPerson 仍处于活动状态。
<?php
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
class Company extends Model
{
// ... other functions
public function contactPersons(): BelongsToMany
{
$this->belongsToMany(Company::class)
->withPivot('started_at', 'resigned_at')
->wherePivotNull('resigned_at');
}
public function resignedContactPersons()
{
$this->belongsToMany(Company::class)
->withPivot('started_at', 'resigned_at')
->wherePivotNotNull('resigned_at');
}
}
您也应该在 ContactPerson 模型上定义这些函数。
如果逻辑变得非常复杂,请考虑创建一个Pivot 模型(CompanyContactPerson)。
请注意 , 的组合contact_person_id
应该company_id
started_at
是唯一的。否则,考虑在表中添加一个像 ID 这样的主键company_contact_person
来标识这些记录。
推荐阅读
- conv-neural-network - 使用数据集中带有水印的图像进行 CNN 分类
- google-data-studio - 上传数据源时更改日期格式
- php - 如何在php中解析这个json数据?
- javascript - 如何呈现项目列表而不是键
- css - 在 BOOSTRAP 导航栏内移动项目
- swift - 如何在 Swift 5 中扩展字典(字符串,数组)
- vba - 在表单加载时,如何根据表中的是/否列自动进行列表框选择
- rest - 如何使用 REST Api Sharepoint 获取当前用户的所有调查答案?
- salesforce - 如何在 Salesforce 中自定义验证您的身份(输入验证码)屏幕?
- android - 错误:使用未声明的标识符“PTHREAD_MUTEX_ROBUST”为 aarch64-linux-android 目标构建 liblmdb-sys