我在student
和institution_contact
之间建立了多对多关系。
student
应该只有两个institution_contact
s,我在名为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]]);
}
但是,我认为这会对每个学生两次打到数据库,对吗?那么我最好为数据透视表创建一个模型并删除所有匹配学生ID和类型的条目,然后只需添加新的条目?或者为枢轴表创建一个模型被认为是不好的做法,有没有更好的方法来实现我错过的?
请注意我不使用同步的原因是因为我依赖type属性来维持每个学生只有两个联系人。我没有意识到修改现有枢轴的方法,而不会导致每个学生要求我的两个联系人出现问题。
编辑:
我可以运行以下代码来使用DB
执行删除,而不是创建模型。
DB::table('institution_contact_student') // the pivot table
->whereIn('student_id', $studentIds)
->where('type', 1)
->delete();
答案 0 :(得分:0)
如果我已正确理解您的问题,那么您可以使用updateExistingPivot方法更新数据透视表。但首先,您必须在关系中定义数据透视表。例如,
public function institutionContacts(){
return $this->belongsToMany('institutionContact')->withPivot('type');
}
在此之后,您所要做的就是使用以下代码:
$student
->institutionContacts()
->updateExistingPivot($contactId, ["type" => 1]);
希望这有帮助。