У меня есть эти три таблицы: Class
, Schedules
а также Attendance
,
Профессор выбирает расписание, пропущенное студентом для записи посещаемости. Для этого он использует флажки, которые будут возвращать student_id
, class_id
а также schedule_id
, Каждый раз, когда профессора меняют посещаемость, необходимо менять schedule_id
,
Проблема в том, когда он разыгрывает непосещение («Этот студент пропустил мой класс в этом графике») но хочу вернуть его потом («Этот студент не пропустил урок в этом расписании, моя ошибка»), профессор удалит посещаемость и schedule_id
должен быть отброшен
Итак, мне нужен способ найти способ удалить внешний ключ, если у меня нет schedule_id по запросу в updateOrCreate
метод.
Контроллер, который разыгрывает посещаемость:
foreach ($attendances as $f){
$class->attendances()->updateOrCreate(
[
'class_id' => $f['class_id'],
'student_id' => $f['student_id'],
],[ [
'schedule_id' => $f,
]
);
}
Модель класса:
public function attendances()
{
return $this->hasMany(Attendance::class);
}
Связи:
Class->hasMany->attendances(). Attendances->hasMany->schedules.
Проверяя значение вашего флажка, вы можете установить необходимые действия для этого варианта использования.
if (Request::get('mycheckbox')) {
// got schedule_id
// Insert/Update Record
} else {
// Don't have schedule_id
// Delete Record
Schedules::destroy($id);
}
Если вы просто хотите обновить таблицу многие ко многим, удалив все идентификаторы, которые больше не указаны в запросе, используйте sync
, Ссылка на документацию: https://laravel.com/docs/5.5/eloquent-relationships#inserting-and-updating-related-models -> Раздел Синхронизация ассоциаций
Вы также можете использовать метод синхронизации для построения ассоциаций «многие ко многим». Метод синхронизации принимает массив идентификаторов для размещения в промежуточной таблице. Любые идентификаторы, которых нет в данном массиве, будут удалены из промежуточной таблицы. Таким образом, после завершения этой операции в промежуточной таблице будут существовать только идентификаторы в данном массиве.
Других решений пока нет …