Сводная таблица Laravel должна содержать повторяющиеся записи

#mysql #database #laravel

Вопрос:

Я использую Laravel для создания небольшой системы списков клиентов.

Мне нужно связать КОМПАНИЮ с КОНТАКТНЫМ ЛИЦОМ. В обычной ситуации я могу использовать множество сводных таблиц для их связывания и обновления.

Однако мне нужно вести исторические записи. Это означает, что один и тот же человек может выступать в качестве контактного лица в более ранний период, уйти в отставку и повторно назначить позже в другой период.

Я пытаюсь дублировать записи сводной таблицы с помощью phpMyAdmin, дважды связываю одну и ту же КОМПАНИЮ с одним и тем же КОНТАКТНЫМ ЛИЦОМ, и при извлечении записей КОМПАНИИ были найдены две записи.
Однако, как использовать Laravel для дублирования записей? Как использовать Laravel для их свертывания. Или я просто делаю это неправильно?

Большое спасибо!

ИЗМЕНИТЬ : Пример :
Компания А наняла г-на А в период с 01-01-2001 по 02-02-2001, Компания А снова наняла г-на А с 03-03-2001 по 04-04-2001. В таблице компаний есть компании B,C,D … В таблице сотрудников тоже есть мистер B, C , D.

Используйте сводную таблицу отношений Laravel, чтобы связать компанию A с г-ном А. В приведенном выше случае будет две записи (мне нужна историческая запись).

Является ли это правильным способом справиться с такими случаями с Ларавелем, у которого много-много отношений? Или мне следует рассмотреть другие способы ?

Комментарии:

1. вы должны предоставить образец здесь,чтобы другим было легко понять

2. Дорогой Нет, это вопрос теории. Сможет ли приведенный выше пример проиллюстрировать мой вопрос ?

Ответ №1:

Сводная таблица может содержать дополнительные столбцы. Вы могли бы рассмотреть возможность добавления миграций, которые добавляют started_at resigned_at поля даты и времени в вашу сводную таблицу.

Ваша структура данных будет выглядеть примерно так:

Компания

  • ID

Contact_person_company

  • идентификатор контактного лица
  • идентификатор компании
  • начат_ат
  • ушел в отставку_ат

Контактное лицо

  • ID

После этого вы можете создать в своей модели функции для работы с сводными столбцами и проверить их состояние. Значение null для resigned_at столбца указывает на то, что контактное лицо все еще активно.

 <?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');
    }

}
 

Вы также должны определить эти функции в модели контактного лица.

Если логика становится очень сложной, подумайте о создании сводной модели (CompanyContactPerson).

Пожалуйста , обратите внимание, что комбинация contact_person_id , company_id started_at должна быть уникальной. В противном случае рассмотрите возможность добавления первичного ключа, такого как идентификатор company_contact_person таблицы, для идентификации этих записей.

Комментарии:

1. Спасибо, Эрик, ваш ответ «комбинация contact_person_id, company_id started_at должна быть уникальной» ответил на мой вопрос !!!; «добавление первичного ключа, такого как идентификатор таблицы contact_person_company, для идентификации этих записей». покажи мне, как решить эту проблему !!

2. Дорогой Эрик, большое вам спасибо за ваши подсказки, теперь моя проблема в том, что «contact_person_id, идентификатор компании» не является единицей. можете ли вы показать мне свою идею о том, как добавить таблицу contact_person_company между ними ?

3. К сожалению, я не понимаю вашего вопроса. Вам следует создать сводную таблицу (если вы еще этого не сделали) под названием: company_contact_person . Добавьте вышеупомянутые функции, и вы должны быть настроены. Вы можете добавить composite primary key . Однако Eloquent не поддерживает эти ключи. Вы также можете рассмотреть возможность добавления id в эту таблицу, чтобы они стали уникальными записями.

4. Дорогой Эрик, Твои хины очень полезны. Я постараюсь разобраться с окончательной версией. Большое спасибо!