Php 在Laravel 5.6中调整我的方法存储()以更新()

Php 在Laravel 5.6中调整我的方法存储()以更新(),php,laravel,laravel-5,Php,Laravel,Laravel 5,这是我的方法存储()。天花板上有一张无法触及的支票 有关信息,该代码对于方法store()是正确的 我想创建我的方法更新(),但我被卡住了。。。 我不明白如何在我的方法更新()中调整我的方法存储的代码 我想做两件事: 1) 更改字段的值 2) 检查天花板 public function update(Request $request, $id) { $request->validate([ 'date_seance' => 'requir

这是我的方法存储()。天花板上有一张无法触及的支票

有关信息,该代码对于方法store()是正确的

我想创建我的方法更新(),但我被卡住了。。。 我不明白如何在我的方法更新()中调整我的方法存储的代码

我想做两件事:

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();

   }

}


编辑19年10月13日代码Watercayman

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!'); 
        }

    }
在我的表单修改之后,我有两条消息出现


我想我的情况有问题吗?

是一样的,只需为更新更改else

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();
    }


}

相同吗?只需更改更新的else

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();
    }


}

有很多方法可以做到这一点。这取决于你想要达到的目标

方法1,简单:

如果您想简单地使用发送的任何内容更新培训模型(然后检查上限),那么可以通过路由模型绑定将大部分内容自动化

在您的web.php中

Route::put('training/{training}', 'TrainingController@update');
public function update(Request $request, Training $training){
    if($this->doCeilingCheck($training))
        $training->update($request->all());
    else{ // return ceiling met }
public function update(Request $request, $id){
    $training = Training::find($id);
    if($this->doCeilingCheck($training)){
        $training->update($request->all());
    }else{ // return ceiling met }
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;
    }
}
然后在您的培训控制器中

Route::put('training/{training}', 'TrainingController@update');
public function update(Request $request, Training $training){
    if($this->doCeilingCheck($training))
        $training->update($request->all());
    else{ // return ceiling met }
public function update(Request $request, $id){
    $training = Training::find($id);
    if($this->doCeilingCheck($training)){
        $training->update($request->all());
    }else{ // return ceiling met }
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;
    }
}
方法2,不绑定

Route::put('training/{training}', 'TrainingController@update');
public function update(Request $request, Training $training){
    if($this->doCeilingCheck($training))
        $training->update($request->all());
    else{ // return ceiling met }
public function update(Request $request, $id){
    $training = Training::find($id);
    if($this->doCeilingCheck($training)){
        $training->update($request->all());
    }else{ // return ceiling met }
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;
    }
}
您的路径将与现在相同,并且您的函数将不再具有注入模型,而是具有类似的流

在您的培训控制员中

Route::put('training/{training}', 'TrainingController@update');
public function update(Request $request, Training $training){
    if($this->doCeilingCheck($training))
        $training->update($request->all());
    else{ // return ceiling met }
public function update(Request $request, $id){
    $training = Training::find($id);
    if($this->doCeilingCheck($training)){
        $training->update($request->all());
    }else{ // return ceiling met }
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;
    }
}
方法3,筛选字段:

如果您不想在更新后将每个变量传递给更新后的培训模型,您可以筛选出所需的变量,然后像之前一样保存。这可能是导致您出现问题的原因。您是否正在由非学生A的用户更新学生A的培训?因此,可能会将fk_学生更改为错误的学生,并导致因错误的学生而达到上限?:

通过后,如果检查天花板:

   $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();
天花板检查

Route::put('training/{training}', 'TrainingController@update');
public function update(Request $request, Training $training){
    if($this->doCeilingCheck($training))
        $training->update($request->all());
    else{ // return ceiling met }
public function update(Request $request, $id){
    $training = Training::find($id);
    if($this->doCeilingCheck($training)){
        $training->update($request->all());
    }else{ // return ceiling met }
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;
    }
}
我将其移动到同一控制器中的一个单独函数,只是为了让它更容易理解。您不必这样做-如果愿意,可以将代码保存在
update()
中。关键是我们需要检查参加培训的学生是否支付了过多的培训费用。因此,我们希望确保使用相关培训中的学生(
$training->fk_student
),而不是学生填写表单(
$request->get('fk_student')

在您的培训控制器中可选择进一步向下

Route::put('training/{training}', 'TrainingController@update');
public function update(Request $request, Training $training){
    if($this->doCeilingCheck($training))
        $training->update($request->all());
    else{ // return ceiling met }
public function update(Request $request, $id){
    $training = Training::find($id);
    if($this->doCeilingCheck($training)){
        $training->update($request->all());
    }else{ // return ceiling met }
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;
    }
}
编辑

Route::put('training/{training}', 'TrainingController@update');
public function update(Request $request, Training $training){
    if($this->doCeilingCheck($training))
        $training->update($request->all());
    else{ // return ceiling met }
public function update(Request $request, $id){
    $training = Training::find($id);
    if($this->doCeilingCheck($training)){
        $training->update($request->all());
    }else{ // return ceiling met }
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()
方法很有效,因为在添加新的训练后,计数将发生变化。也就是说,在if检查之前,您还没有在
store()
方法中进行第二次培训,因此没有达到上限。但是,在
update()
方法中,可能已经达到了培训上限,因此,即使您没有添加新培训或以任何方式更改付款或培训的金额,您也可能会达到错误的上限。按计划-你可以通过允许+1培训来克服这一问题,而不是你的正常上限:

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

然而,这是一种骇人听闻的做法,从逻辑的角度来看,我会问自己,在更新过程中,检查的目的是什么?学生没有改变培训的数量,他们没有改变付款的数量。因此,检查它们是否超出上限可能应该在更新时忽略。他们只是一个接一个地改变数字——他们改变的是课程的细节,而不是数量。我建议完全从
update()
方法中删除该检查,以使其按照您的预期工作。

有多种方法可以做到这一点。这取决于你想要达到的目标

方法1,简单:

如果您想简单地使用发送的任何内容更新培训模型(然后检查上限),那么可以通过路由模型绑定将大部分内容自动化

在您的web.php中

Route::put('training/{training}', 'TrainingController@update');
public function update(Request $request, Training $training){
    if($this->doCeilingCheck($training))
        $training->update($request->all());
    else{ // return ceiling met }
public function update(Request $request, $id){
    $training = Training::find($id);
    if($this->doCeilingCheck($training)){
        $training->update($request->all());
    }else{ // return ceiling met }
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;
    }
}
然后在您的培训控制器中

Route::put('training/{training}', 'TrainingController@update');
public function update(Request $request, Training $training){
    if($this->doCeilingCheck($training))
        $training->update($request->all());
    else{ // return ceiling met }
public function update(Request $request, $id){
    $training = Training::find($id);
    if($this->doCeilingCheck($training)){
        $training->update($request->all());
    }else{ // return ceiling met }
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;
    }
}
方法2,不绑定

Route::put('training/{training}', 'TrainingController@update');
public function update(Request $request, Training $training){
    if($this->doCeilingCheck($training))
        $training->update($request->all());
    else{ // return ceiling met }
public function update(Request $request, $id){
    $training = Training::find($id);
    if($this->doCeilingCheck($training)){
        $training->update($request->all());
    }else{ // return ceiling met }
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;
    }
}
您的路径将与现在相同,并且您的函数将不再具有注入模型,而是具有类似的流

在您的培训控制员中

Route::put('training/{training}', 'TrainingController@update');
public function update(Request $request, Training $training){
    if($this->doCeilingCheck($training))
        $training->update($request->all());
    else{ // return ceiling met }
public function update(Request $request, $id){
    $training = Training::find($id);
    if($this->doCeilingCheck($training)){
        $training->update($request->all());
    }else{ // return ceiling met }
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;
    }
}
方法3,筛选字段:

如果您不想在更新后将每个变量传递给更新后的培训模型,您可以筛选出所需的变量,然后像之前一样保存。这可能是导致您出现问题的原因。您是否正在由非学生A的用户更新学生A的培训?因此,可能会将fk_学生更改为错误的学生,并导致因错误的学生而达到上限?:

通过后,如果检查天花板:

   $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();
天花板检查

Route::put('training/{training}', 'TrainingController@update');
public function update(Request $request, Training $training){
    if($this->doCeilingCheck($training))
        $training->update($request->all());
    else{ // return ceiling met }
public function update(Request $request, $id){
    $training = Training::find($id);
    if($this->doCeilingCheck($training)){
        $training->update($request->all());
    }else{ // return ceiling met }
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;
    }
}
我将其移动到同一控制器中的一个单独函数,只是为了让它更容易理解。您不必这样做-如果愿意,可以将代码保存在
update()
中。关键是我们需要检查参加培训的学生是否支付了过多的培训费用。因此,我们希望确保使用相关培训中的学生(
$training->fk_student
),而不是学生填写表单(
$request->get('fk_student')

在您的培训控制器中可选择进一步向下

Route::put('training/{training}', 'TrainingController@update');
public function update(Request $request, Training $training){
    if($this->doCeilingCheck($training))
        $training->update($request->all());
    else{ // return ceiling met }
public function update(Request $request, $id){
    $training = Training::find($id);
    if($this->doCeilingCheck($training)){
        $training->update($request->all());
    }else{ // return ceiling met }
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;
    }
}
编辑

Route::put('training/{training}', 'TrainingController@update');
public function update(Request $request, Training $training){
    if($this->doCeilingCheck($training))
        $training->update($request->all());
    else{ // return ceiling met }
public function update(Request $request, $id){
    $training = Training::find($id);
    if($this->doCeilingCheck($training)){
        $training->update($request->all());
    }else{ // return ceiling met }
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()
方法很好,因为