首页 > 解决方案 > 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 多对多关系处理此类情况是否正确?还是我应该考虑其他方式?

标签: mysqldatabaselaravel

解决方案


数据透视表可以包含其他列。您可以考虑添加将日期时间字段添加started_atresigned_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来标识这些记录。


推荐阅读