Адаптируйте мой метод store () для update () в Laravel 5.6 - PullRequest
0 голосов
/ 11 октября 2019

Вот мой метод store (). на потолке есть проверка, которую нельзя достать.

Для информации, код правильный для метода store ().

public function store(Request $request)
    {
        $request->validate([
                'date_seance' => 'required',
                'hour_start' => 'required',
                'hour_end' => 'required',
                'fk_student' => 'required'


        ]);


       $date_seance = $request->get('date_seance'); 
       $hour_start = $request->get('hour_start'); 
       $hour_end = $request->get('hour_end'); 
       $fk_student = $request->get('fk_student');

        $thisStudentsTrainings = Training::where('fk_student', $fk_student)->get();

        $thisStudentsPayments = Payment::where('fk_student', $request->get('fk_student'))->get();


        if(count($thisStudentsTrainings) >= count($thisStudentsPayments) * 5) {
            return redirect()->route('trainings.index') 
                ->with('error', 'ceiling reached!'); 
        }


        else{
            Training::create($request->all());
                return redirect()->route('trainings.index')
                    ->with('success', 'Add');
        }


    }

Я хочу создать свой метод update (), но я застрял ... Я не понимаюкак я могу адаптировать свой код моего хранилища методов в методе update ()?

Я хочу сделать 2 вещи:

1) изменить значение поля

2) проверка потолка

public function update(Request $request, $id)
{  


   $request->validate([
                'date_seance' => 'required',
                'hour_start' => 'required',
                'hour_end' => 'required',
                'fk_student' => 'required',


        ]);


   if{
       $trainings = Training::find($id);
       $trainings->date_seance = $request->get('date_seance');
       $trainings->hour_start = $request->get('hour_start');
       $trainings->hour_end = $request->get('hour_end ');
       $trainings->fk_student = $request->get('fk_student ');
       $trainings->save();
       return redirect()->route('trainings.index')
              ->with('success', 'Update!')->withInput();

   }

}


Изменить код 13/10/19 Водный кейман

protected function doCeilingCheck($training)
    {
        $thisStudentsTrainings = Training::where('fk_student', $training->fk_student)->get();

        $thisStudentsPayments = Payment::where('fk_student', $training->fk_student)->get();


        if(count($thisStudentsTrainings) >= count($thisStudentsPayments) * 2) {
            return redirect()->route('trainings.index') 
            ->with('error', 'ceiling reached!'); 
        }else{

            return redirect()->route('trainings.index')
                    ->with('success', 'Add');
        }
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        $trainings = Training::find($id);
        $students = Student::all();
        $formers = Former::all();
        $motorbikes = Motorbike::all();
        $payments = Payment::all();

        return view('admin.trainings.edit', compact('trainings', 'students', 'formers', 'motorbikes', 'payments'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $request->validate([
                'date_seance' => 'required',
                'hour_start' => 'required',
                'hour_end' => 'required',
                'fk_motorbike' => 'required',
                'fk_former' => 'required',
                'fk_student' => 'required'
        ]);


        $trainings = Training::find($id);
        if($this->doCeilingCheck($trainings)){
            return redirect()->route('trainings.index')
            ->with('success', 'Update!')->withInput();
        }else{ 
            $trainings->date_seance = $request->get('date_seance');
            $trainings->hour_start = $request->get('hour_start');
            $trainings->hour_end = $request->get('hour_end');
            $trainings->fk_motorbike = $request->get('fk_motorbike');
            $trainings->fk_former = $request->get('fk_former');
            $trainings->fk_student = $request->get('fk_student');
            $trainings->save();
            return redirect()->route('trainings.index') 
            ->with('error', 'ceiling reached!'); 
        }

    }

После внесения изменений в мою форму у меня есть 2 сообщения, которыепоявляются.

enter image description here

Есть проблема с моим состоянием, я думаю?

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Есть несколько способов сделать это. Это зависит от того, чего вы пытаетесь достичь.

Метод 1, Простой:

Если вы хотите просто обновить модель обучения с помощью всего отправленного (а затемпроверьте потолок), вы можете автоматизировать большую часть этого с привязкой модели маршрута.

В вашем web.php :

Route::put('training/{training}', 'TrainingController@update');

Затем в вашем TrainingController :

public function update(Request $request, Training $training){
    if($this->doCeilingCheck($training))
        $training->update($request->all());
    else{ // return ceiling met }

Способ 2, не привязка :

Ваш маршрут будет таким же, как сейчас, и ваша функция больше не будет иметь введенную модель, но будет иметь аналогичный поток.

В вашем TrainingController :

public function update(Request $request, $id){
    $training = Training::find($id);
    if($this->doCeilingCheck($training)){
        $training->update($request->all());
    }else{ // return ceiling met }

Метод 3, поля фильтра:

Если вы не хотите передавать каждую переменнуюПосле обновления к вашей обновленной модели тренировок вы можете отфильтровать то, что вы хотите, и просто сохранить, как вы делали ранее. Это потенциально то, что вызывает у вас проблемы. Обновляете ли вы обучение ученика А пользователем, который не является учеником А? Таким образом, возможно, изменив fk_student на неправильного ученика, а также вызвав потолок, достигнутый из-за неподходящего ученика?:

Внутри вашего TrainingController после прохождения проверки if для потолка:

   $trainings->date_seance = $request->get('date_seance');
   $trainings->hour_start = $request->get('hour_start');
   $trainings->hour_end = $request->get('hour_end ');
   // Maybe you don't want to allow change to FK - just remove this next line
   // $trainings->fk_student = $request->get('fk_student '); 
   $trainings->save();

Проверка потолка :

Я переместил это в отдельную функцию в том же контроллере, просто чтобы это немного легче понять. Вам не нужно этого делать - вы можете оставить код в update(), если хотите. Ключ в том, что нам нужно проверить, заплатил ли СТУДЕНТ НА ​​ЭТОМ ОБУЧЕНИИ слишком много тренировок. Итак, мы хотим убедиться, что использует студента из рассматриваемого курса обучения ($training->fk_student), не студент, заполняющий форму ($request->get('fk_student')).

Опционально вниз в вашем TrainingController :

protected function doCeilingCheck($training){
    $thisStudentsTrainings = Training::where('fk_student', $training->fk_student)->get();

    $thisStudentsPayments = Payment::where('fk_student', $training->fk_student)->get();


    if(count($thisStudentsTrainings) >= count($thisStudentsPayments) * 5) {
        return false
    }else{
        return true;
    }
}

Редактировать :

У вас есть жесткая проверка, чтобы проверить,студент коснулся своего потолка для # тренировок и платежей. Это будет хорошо работать для вашего store() метода, потому что количество будет меняться после добавления нового обучения. То есть вы еще не сделали 2-ю тренировку по методу store() до тех пор, пока не пройдете проверку if, поэтому потолок не достигнут. Однако в методе update() предел обучения может уже достигнут, и, таким образом, вы можете достичь ложного потолка , даже если вы не добавляете новое обучение или не изменяете сумму платежей илитренировки любым способом . В программном плане - вы можете обойти это, допустив +1 тренировку против вашего нормального потолка:

// Instead of the 5 you have in your code:
if(count($thisStudentsTrainings) >= count($thisStudentsPayments) * 6) 

Однако, это хакерская, и с логической точки зрения, я бы спросил себя, в чем смысл этой проверки во время обновление ? Студент не меняет количество тренингов, они не меняют количество платежей. Таким образом, проверка, чтобы увидеть, если они находятся за потолком, вероятно, следует игнорировать при обновлении. Они просто меняются как на одинаковые числа - они меняют детали курса, а НЕ их количество. Я предлагаю полностью удалить эту проверку из метода update(), чтобы сделать эту работу, как вы и планировали.

1 голос
/ 12 октября 2019

то же самое, просто измените остальное для обновления

public function update(Request $request,$id)
{
    $request->validate([
            'date_seance' => 'required',
            'hour_start' => 'required',
            'hour_end' => 'required',
            'fk_student' => 'required'


    ]);


   $date_seance = $request->get('date_seance'); 
   $hour_start = $request->get('hour_start'); 
   $hour_end = $request->get('hour_end'); 
   $fk_student = $request->get('fk_student');

    $thisStudentsTrainings = Training::where('fk_student', $fk_student)->get();

    $thisStudentsPayments = Payment::where('fk_student', $request->get('fk_student'))->get();


    if(count($thisStudentsTrainings) >= count($thisStudentsPayments) * 5) {
        return redirect()->route('trainings.index') 
            ->with('error', 'ceiling reached!'); 
    }


    else{
   $trainings = Training::find($id);
   $trainings->date_seance = $request->get('date_seance');
   $trainings->hour_start = $request->get('hour_start');
   $trainings->hour_end = $request->get('hour_end ');
   $trainings->fk_student = $request->get('fk_student ');
   $trainings->save();
   return redirect()->route('trainings.index')
          ->with('success', 'Update!')->withInput();
    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...