Laravel принадлежит компании с более чем 3 первичными ключами - PullRequest
1 голос
/ 12 марта 2020

На самом деле я запутался в случае, какое отношение лучше всего подходит для моего случая, и, на мой взгляд, лучше всего иметь таблицу с 3 первичными ключами.

Чтобы быть более точным c .

У меня есть модель Person в одном из моих БД, которая имеет структуру, подобную

Person:
Id,
FirstName,
LastName,
...

, и другая модель отдела, которая имеет структуру, указанную ниже

Department:
Id,
Name,
Description,
...

И цель состоит в том, чтобы установить редакторов расписания для каждого отдела и добавить также администраторов, которые будут утверждать запрошенные графики от редакторов. Редакторы и администраторы принадлежат одной и той же таблице Person, и, если предположить, нам нужно сопоставить некоторых Person и отдел с некоторым типом. Я думаю о том, чтобы иметь таблицу сопоставления со структурой

PersonID,
DepartmentID,
Type (editor or admin) 

И не уверен, какое отношение подходит для этого лучше всего. Если у нас здесь есть отношение ownToMany с первичными ключами PersonID и DepartmentID, мы столкнемся с проблемой, поскольку один и тот же Person может выступать в качестве редактора и администратора в одном отделе. У меня есть MS SQL сервер в качестве базы данных.

Любые предложения будут оценены

1 Ответ

1 голос
/ 12 марта 2020

Вы можете определить отношения "многие ко многим" и использовать метод wherePivot для выбора по сводной таблице. Тип столбца:

// Department model
public function admins()
{
    return $this->belongsToMany(Person::class)->wherePivot('type', 'admin');
}

public function editors()
{
    return $this->belongsToMany(Person::class)->wherePivot('type', 'editor');
}

// Person model
public function departmentsWhereIsAdmin()
{
    return $this->belongsToMany(Department::class)->wherePivot('type', 'admin');
}

public function departmentsWhereIsEditor()
{
    return $this->belongsToMany(Department::class)->wherePivot('type', 'editor');
}

// Note: we use methods names without parentheses

// usage for department
$department = Department::first(); // for example
dump($department->admins);
dump($department->editors);

// usage for person
$person = Person::first(); // for example
dump($person->departmentsWhereIsAdmin);
dump($person->departmentsWhereIsEditor);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...