对于每笔付款,学生都可以接受培训。
例如,我为学生 // Download file
$file = "http://url.com/file.pdf";
$ch = curl_init($file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
$file_content = curl_exec($ch);
curl_close($ch);
// Add to zip
$zip->addFromString($fname, $file_content);
的付款进行了编码。
然后,我对学生Menier
的培训进行编码。
是正确的!
现在,当我为同一个学生Menier
编码另一笔付款时
我无法添加培训,它正在阻止???
在学生每次付款后如何将支票归零?
Menier
谢谢您的帮助。
控制器培训
$conflitpayment = Payment::where('fk_student', $request->get('fk_student'))
->whereDate('date_payment', ">" , $date_seance)
->first();
if(isset($conflitpayment)){
return redirect()->route('trainings.index')
->with('error', 'Payment! ');
}
$thisStudentsTrainings = Training::with(['payments' => function($query) use($fk_student){
$query->where('fk_student', $fk_student);
}])->get();
$hasPaidForThisTraining = $thisStudentsTrainings ->contains('id', $request->get('fk_training'));
if( count($thisStudentsTrainings) >= 1) {
return redirect()->route('trainings.index')
->with('error', 'No payment ! ');
}
else{
Training::create($request->all());
return redirect()->route('trainings.index')
->with('success', 'Add');
}
答案 0 :(得分:1)
我不知道这个控制器是什么,或者是什么在给它供电。但是,看来代码正在正确地执行与编写的代码相反的工作。看来是在阻止学生向已付款的培训添加付款。
此行:
$hasPaidForThisTraining = $thisStudentsTrainings ->contains('id', $request->get('fk_training'));
查看学生接受的所有培训,然后检查从表格传递的培训ID是否与他要付费的培训ID相同。如果匹配,则阻止他付款。这似乎可行(尽管我不确定是否需要对$conflitpayment
进行第一个查询,或者它是否正确-但这不是这里的问题)。我不明白的是,为什么在创建新培训的同一部分中要支票付款。检查多次付款的方法可能应该是创建付款方式,而不是培训-因为您要阻止多次付款,而不一定是培训。
我怀疑可能正在发生的事情是,添加新培训的表单正在通过 payment 表单运行。或者付款和培训表单正在通过控制器中的相同方法。即,您在表单上有一个fk_training
字段,并且该字段带有值。如果要创建新培训,则该方法中不应包含fk_training
字段。将付款if-checks的逻辑与创建新付款的逻辑分离为不同的方法,这应该可以解决您的问题。
如果此字段是通过表格填写的,并且是现有的培训,即使是在付款方式上,也会阻止创建新培训。
编辑
您在注释中指出“为2项培训支付1项费用。在这2项培训之后,我再次支付。”这与代码所做的非常不同。该代码先前检查了学生是否为此特殊培训付费,如果是,则停止付款。您的评论背后的逻辑现在非常不同。并使代码更加复杂。
要使其正常工作,您需要回答一些问题。首先,他们需要支付两次不同的培训费用吗?如果是这样,我们是否仍要阻止他们支付两次相同的培训费用?我认为是,这意味着$hasPaidForThisTraining
检查是正确的。
但是,如果不,并且他们可以支付两次具有相同ID的培训费用,那么我们必须更改if-check来计数他有多少次支付相同的查询。现在,如果他们一次付款,它将失败。
if( count($thisStudentsTrainings) >= 1) { } // CHANGE TO >=2
或者您可能想检查他们是否已经支付了两次培训费用并且已经到期? IE浏览器,他们现在需要再次付款?如果您直接在学生的培训中附加了付款,并且您只能为一项培训付费,这并不太难:
$PaymentHasBeenMadeForThisTraining = Payment::where('fk_student', $fk_student)
->where('fk_training', $request->get('fk_training'))
->first();
您可以针对需要核实他们是否已付款的每次培训进行此操作。但是,这变得很复杂-如果您说他们可以为任何两次培训付费,然后如果他们接受了这些培训,则他们需要再次付费。您需要先缩小逻辑范围,然后才能进行编码。允许“使用”付款的参数是什么?是根据日期吗?如果是这样,如果学生不参加该课程怎么办?您如何在代码中说明这一点?或者,如果他们花了一个钱又想买另外两个呢?他们可以这样做吗?如果可以,那么确定要支付第二笔款项的决心是什么?
我无法在代码中表示这一点,因为我无法理解所有规则,为了将其限制在代码中,您需要了解这些规则。我建议您简化这种方式。让您的问题中的上述方法仅做一件事或两件事-也许检查一下是否已为所涉课程付款。然后再检查一下他们是否还有“信用”。
我认为您永远不会使用这种方法来创建培训。如果存在fk_training
的外键(必须在此函数中,否则查询将失败),则已经存在可能无法通过if-check的培训。因此,它将永远不会像当前编码那样创建新的编码。建议您重新考虑本节的工作原理,并从新培训的 creation 中分离出付款支票。他们是否为此培训付费?是的,如果可以,他们是否有资格参加下一次培训?如果不是这样,请在他们有机会进行培训之前,在表格上标记他们不可用。首先获得付款是一项单独的操作-然后在他们获得信用后再开始创建新的培训。
这甚至很难解释-我认为如果简化一下,您的生活就会轻松很多。以前,您可以按培训核对付款-一对一,并且根据这些规则可以正常工作。如果要允许两次付款,您要么需要制定复杂的规则...,要么只是将付款记为学生帐户的贷项,然后他们就可以根据系统中的贷项来选择课程。如果您的实际使用情况可以解决此问题,则简单得多。