Laravel数据透视表需要有重复的条目



我正在使用Laravel构建一个小型客户列表系统。

我需要将公司与CONTACT_PERSON联系起来。在正常情况下,我可以使用多对多透视表来链接和更新它们。

然而,我需要保留历史记录。这意味着同一个人可以在一段时间内提前担任联系人,辞职,并在另一段时间后重新任命。

我尝试用phpMyAdmin复制数据透视表条目,使同一个COMPANY链接同一个CONTACT_PERSON两次,在检索COMPANY记录时发现了两个条目
但是,如何使用Laravel复制条目?如何使用Laravel来治愈这些。或者我只是用了错误的方式?

非常感谢!

编辑:示例:
A公司在2001年1月1日至2001年2月2日期间雇用A先生,2001年3月3日至2001年4月4日,A公司再次聘用A先生。有B、C、D公司。。。在公司表中,员工桌上还有B、C、D先生。

使用Laravel关系透视表将公司A与先生联系起来。在上述情况下,A将有两条记录(我需要有一条历史记录(。

这是与拉拉威尔多对多关系处理此类案件的正确方式吗?或者我应该考虑其他方式?

数据透视表可以包含其他列。您可以考虑添加迁移,将started_atresigned_at日期时间字段添加到数据透视表中。

你的数据结构看起来像这样:

公司

  • id

联系人_个人_公司

  • 联系人_个人id
  • company_id
  • 起始时间
  • 辞职_时间

联系人

  • id

之后,您可以在模型中创建函数来处理枢轴列并检查其状态。resigned_at列的空值表示ContactPerson仍处于活动状态。

<?php
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentRelationsBelongsToMany;
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_idcompany_idstarted_at的组合应该是唯一的。否则,考虑在company_contact_person表中添加一个主键(如ID(来标识这些记录。

最新更新