#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. Дорогой Эрик, Твои хины очень полезны. Я постараюсь разобраться с окончательной версией. Большое спасибо!