我正在使用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_at
和resigned_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_id
、company_id
和started_at
的组合应该是唯一的。否则,考虑在company_contact_person
表中添加一个主键(如ID(来标识这些记录。