laravel - 在 Laravel 的 update() 中调整我的函数 store()

标签 laravel laravel-5

函数 store() 是

       $date_start = $request->get('date_seance'); 
       $fk_motorbike = $request->get('fk_motorbike');

       $conflictRevision = Revision::where('fk_motorbike', $fk_motorbike)
            ->whereDate('date_revision_start', "<=" , $date_start)
            ->whereDate('date_revision_end', ">=", $date_start)
            ->first();

        $conflictTraining = Training::where('fk_motorbike', $fk_motorbike)
            ->whereDate('date_seance', "=" , $date_start)
            ->first();

        if(isset($conflictTraining) || isset($conflictRevision)){
            return redirect()->route('trainings.index')
                 ->with('error', 'Duplicate ');
        }

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

我想将我的函数 store() 调整为方法 update(),因为我想修改我的字段的不同值。

我知道要更改 date_seance 的值,但函数 update() 不会更改其他值,例如:hour_start、hour_end、fk_motorbike、fk_former,这是一个问题...

public function update(trainingsRequest $request, $id)
    {   
        $date_seance = $request->get('date_seance'); 
        $hour_start = $request->get('hour_start');
        $hour_end = $request->get('hour_end');
        $fk_motorbike = $request->get('fk_motorbike');
        $fk_former = $request->get('fk_former');


        $conflictRevision = Revision::where('fk_motorbike', $fk_motorbike)
            ->whereDate('date_revision_start', "<=" , $date_seance)
            ->whereDate('date_revision_end', ">=", $date_seance)
            ->where('hour_start', "<=" , $date_seance)
            ->where('hour_end', "<=" , $date_seance)
            ->first();

        $conflictTraining = Training::where('fk_motorbike', $fk_motorbike)
            ->whereDate('date_seance', "=" , $date_seance)
            ->where('hour_start', "<=" , $date_seance)
            ->where('hour_end', "<=" , $date_seance)
            ->first();


        if(isset($conflictTraining) || isset($conflictRevision)){
            return redirect()->route('trainings.index')
                 ->with('error', 'Duplicate ');
        }


        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_motorbike = $request->get('fk_motorbike');
            $trainings->fk_former = $request->get('fk_former');
            $trainings->save();
            return redirect()->route('trainings.index')
                    ->with('success', 'update')->withInput();
        }
    }

我知道问题出在这里:

 if(isset($conflictTraining) || isset($conflictRevision)){
            return redirect()->route('trainings.index')
                 ->with('error', 'Duplicate ');
        }

我已经尝试过但没有成功:

 if( (isset($conflictTraining) && $conflictTraining->id !== intval($id))
        || (isset($conflictRevision) && $conflictRevision->id !== intval($id)) ){
            return redirect()->route('trainings.index')
             ->with('error', 'Duplicate date! ');
        }

感谢您的帮助。

最佳答案

因为您想要更新培训,所以您不想检查传入的表单 id与 if-check 中的修订相同。 id即将到来的(您正在比较的)是用于培训的。所以 if-check 应该看起来更像这样:

if( (isset($conflictTraining) && $conflictTraining->id !== intval($id))
    || isset($conflictRevision)) ){
        return redirect()->route('trainings.index')
         ->with('error', 'Duplicate date! ');
    }

省略 id上面的修订检查不会产生错误命中(修订id可能永远不会===传入的训练id strong>,如果确实如此,那么它就是错误的,因为它正在比较错误的 id )

但是,修订版本的冲突检查也可能会给您带来问题。这一行:

 $conflictRevision = Revision::where('fk_motorbike', $fk_motorbike)
        ->whereDate('date_revision_start', "<=" , $date_seance)
        ->whereDate('date_revision_end', ">=", $date_seance)
        ->where('hour_start', "<=" , $date_seance)  // <--Suggest remove this
        ->where('hour_end', "<=" , $date_seance)  // <--Suggest remove 
        ->first();

正在检查修订模型的开始时间。如果没有hour_start/end在该模型中,或者如果您只是检查 seance 是否与修订同一天,这可能会导致问题。我将删除查询以检查 hour_starthour_end .

同样的事情可能适用于训练查询。如果您想详细检查表单中的新培训是否在同一时间,这很好。但如果是这样,这是一个更详细的检查 - IE 新训练是否同时开始或同时完成。但是,这不会检查训练是否按照您设置的方式在旧训练的中间进行(两者都会检查 <= )。您可能希望考虑仅检查新培训是否与旧培训在同一天以及任何潜在的修订。 IE 删除了训练查询的时间检查,以使其变得更简单 - 一旦您开始工作,也许可以添加更严格的查询参数,例如开始/结束的时间。

IE 我建议暂时删除它,直到它正常工作为止:

->where('hour_start', "<=" , $date_seance)
->where('hour_end', "<=" , $date_seance)

关于laravel - 在 Laravel 的 update() 中调整我的函数 store(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57795743/

相关文章:

laravel - 如何获取多态多对多关系子查询的自动 id 列名称?

php - 没有模型 [App\Models\Match] 的查询结果

google-app-engine - AppEngine App Deploy 给出 "Failed to copy file."

php - MySQL 选择 3 行具有相同值的行

mysql - 如何编写数据库查询来获取 laravel-8 中列值为 1 的所有记录?

php - 关于elasticsearch-php的使用

ajax - 拉拉维尔 : cannot create correct DELETE action request

php - Laravel 和 Typeahead.js : retrieve category name but submit its ID to the database?

javascript - jquery 中的 $.post 函数不起作用

php - Laravel 通过数据透视表查询数据