У меня есть много разных отношений между student
и institution_contact
.Обновление сводной таблицы в Eloquent
student
s должны всегда иметь два institution_contact
с и у меня есть атрибут сводной таблицы с именем type
быть установлен как 1 или 2.
Итак, моя сводная таблица выглядит следующим образом: institution_contact_student: id, institution_contact_id, student_id, type
Я столкнулся с трудностями при принятии решения о том, как подойти к вопросу добавления/обновления сводной таблицы. Скажем, у меня есть 100 студентов, и я хочу, чтобы назначить им контакт с типом 1.
мое текущее решение, чтобы удалить контакт, а затем добавить его:
$students = Student::all(); // the 100 students
$contactId = InstitutionContact::first()->id; // the contact
foreach ($students as $student) {
// remove existing contact
$student
->institutionContacts()
->newPivotStatement()
->where('type', 1)
->delete();
// add new contact
$student
->institutionContacts()
->attach([$contactId => ['type' => 1]]);
}
Однако, я думаю, что это будет ударить по базе данных дважды для каждого ученика, не так ли? Так было бы мне лучше создать модель для сводной таблицы и удалить все записи, которые соответствовали бы идентификатору студента и типу, а затем просто добавить новые? Или создать модель для сводной таблицы будет считаться плохой практикой и есть ли лучший способ добиться этого, что я пропустил?
Обратите внимание, что причина, по которой я не использую синхронизацию, заключается в том, что я полагаюсь на атрибут типа, чтобы поддерживать только два контакта для каждого учащегося. Я не знаю, как изменить существующий опорный стержень, не вызывая проблем с моими двумя контактами по требованию ученика.
Edit:
Вместо создания модели я мог бы выполнить следующий код, чтобы выполнить удаление с помощью DB
.
DB::table('institution_contact_student') // the pivot table
->whereIn('student_id', $studentIds)
->where('type', 1)
->delete();
Если у меня была модель для поворота, процесс удаления можно было бы сделать за один раз, используя 'whereIn' для' student_id', однако для вставки вы правы, это будет один на одного учащегося, но, по крайней мере, он сбит пополам? – haakym