public function doDistribuer($id, $input) { $return = true; try { $tp = $this->model->findOrFail($id); if (isset($input['distribue'])) { //distribue les classes $classes = $tp->classes()->wherein('classe_id', $input['distribue'])->get(); foreach ($classes as $classe) { //TODO mettre toute la création dans une transaction Note::forClasse($classe->id)->forTP($tp->id)->delete(); //efface les notes déjà distribuées pour ce TP/Classe $etudiants = $classe->etudiants; $questions = $tp->questions()->orderBy('ordre')->get(); foreach ($etudiants as $etudiant) { $i = 1; foreach ($questions as $question) { $note = new Note(); $note->classe_id = $classe->id; $note->tp_id = $tp->id; $note->question_id = $question->id; $note->etudiant_id = $etudiant->id; $note->ordre = $i++; $note->save(); } } //distribue une copie au prof pour qu'il puisse l'essayer $i = 1; foreach ($questions as $question) { $note = new Note(); $note->classe_id = $classe->id; $note->tp_id = $tp->id; $note->question_id = $question->id; $note->etudiant_id = Auth::user()->id; $note->ordre = $i++; $note->save(); } //set le flag pour indiquer que c'est distribué $classe->pivot->distribue = true; $classe->pivot->save(); } } //retire les classes if (isset($input['retire'])) { $classes = $tp->classes()->wherein('classe_id', $input['retire'])->get(); foreach ($classes as $classe) { Note::forClasse($classe->id)->forTP($tp->id)->delete(); //efface les notes déjà distribuées pour ce TP/Classe //reset le flag pour indiquer que c'est pas distribué $classe->pivot->distribue = false; $classe->pivot->save(); } } } catch (Exception $e) { $return = false; } return $return; }