2015-11-19 5 views
1

У меня есть много разных отношений между 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(); 
+0

Если у меня была модель для поворота, процесс удаления можно было бы сделать за один раз, используя 'whereIn' для' student_id', однако для вставки вы правы, это будет один на одного учащегося, но, по крайней мере, он сбит пополам? – haakym

ответ

0

Если я понял ваш вопрос правильно, то вы можете использовать метод updateExistingPivot для обновления сводного table.But первого, конечно, вы должны определить точку опоры в ваших отношениях. Например,

public function institutionContacts(){ 
    return $this->belongsToMany('institutionContact')->withPivot('type'); 
} 

после этого, все, что вам нужно сделать, это использовать следующий код:

$student 
     ->institutionContacts() 
     ->updateExistingPivot($contactId, ["type" => 1]); 

Надеется, что это помогает.

Смежные вопросы