Php 在Laravel 5.6中调整我的方法存储()以更新()
这是我的方法存储()。天花板上有一张无法触及的支票 有关信息,该代码对于方法store()是正确的 我想创建我的方法更新(),但我被卡住了。。。 我不明白如何在我的方法更新()中调整我的方法存储的代码 我想做两件事: 1) 更改字段的值 2) 检查天花板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
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()
方法很好,因为