在Eloquent

时间:2015-11-19 13:03:23

标签: laravel laravel-5 eloquent pivot-table

我在studentinstitution_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();

1 个答案:

答案 0 :(得分:0)

如果我已正确理解您的问题,那么您可以使用updateExistingPivot方法更新数据透视表。但首先,您必须在关系中定义数据透视表。例如,

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

在此之后,您所要做的就是使用以下代码:

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

希望这有帮助。