我的目标是,当我为一个payment的学生编码时。他(学生)可以跟随2 trainings 每一支付。(这是最高限额-1付款=2次培训)
在我的表单Payment中,我编码了一个学生,例如Menier。

这个学生有权接受两次培训(这是上限)。
以我的形式培训:我为学生Menier编写了2个培训代码。

我的第一个问题:我怎么能把训练的次数减少两个呢?
(因此,如果我编码另一个训练,它必须阻止!)
我的第二个问题,如果我编码2支付相同的学生。该学生有权接受4次培训。如何创建这类算法?

这是我现在的密码,我知道不是很多.
编辑05-10-2019年-控制器培训
public function store(Request $request)
{
$request->validate([
'date_seance' => 'required',
'hour_start' => 'required',
'hour_end' => 'required',
'fk_motorbike' => 'required',
'fk_former' => 'required',
'fk_student' => 'required',
'fk_typeseance' => 'required'
]);
$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_student = $request->get('fk_student');
$fk_former = $request->get('fk_former');
$fk_typeseance = $request->get('fk_typeseance');
$payments = Payment::where('fk_student', $request->get('fk_student'))->first();
if(!isset($payments)){
return redirect()->route('trainings.index')
->with('error', 'No payment, no training! ');
}
$thisStudentsTrainings = Training::where('fk_student', $fk_student)->get();
if(count($thisStudentsTrainings) >= 2){
return redirect()->route('trainings.index')
->with('error', 'The ceiling is 2 trainings! ');
}
$thisStudentsPayments = Payment::where('fk_student', $request->get('fk_student'))->get();
if( (count($thisStudentsPayments) * 2) < count($thisStudentsTrainings) ) {
return redirect()->route('trainings.index')
->with('error', 'test!');
}
else{
Training::create($request->all());
return redirect()->route('trainings.index')
->with('success', 'Add');
}
}你知道我怎样才能解决我的问题吗?我还是个拉拉的初学者。
For Watercayman


谢谢您抽时间见我。
发布于 2019-10-04 22:24:29
这也不算太糟。由于支付并不直接与特定的培训(即您有一个信用系统),您可以很容易地通过几个查询做到这一点。
我的第一个问题:我怎样才能把训练的次数减少两个呢?
从基础开始,并在数据库中找到该学生的培训数量:
$thisStudentsTrainings = Training::where('fk_student', $fk_student)->get();或者,您可以从相反的位置进入这个简单的查询:
$student = Student::with('trainings')->get();
$thisStudentsTrainings = $student->trainings;然后,限制两次培训(不计报酬):
if(count($thisStudentsTrainings) >= 2){ too many trainings }现在,您已经有了培训的数量,如果您还想确保系统中有支付,那么让我们获得这些费用:
$thisStudentsPayments = Payment::where('fk_student', $request->get('fk_student'))->get();要检查他们是否为培训支付了费用,您现在有了需要的两部分数据。你只需弄清楚他们是否支付了正确的培训金额,根据2支付=1次培训。所以:
if( (count($thisStudentsPayments) * 2) < count($thisStudentsTrainings) ) {
// They have not made enough payments!
}我的第二个问题,如果我编码2支付给同一个学生。该学生有权接受4次培训。如何创建这类算法?
以上将适用于2或4或任何你想要的。
现在,如果你想执行最多2次每次支付培训,我们也可以检查这一点。但是,这开始在逻辑上变得有点复杂或循环。如果你能避免这种情况,那就容易多了。但是,让我们检查一下每次付款最多2次,也就是在上面的一次之后加一个相等的支票:
if( (count($thisStudentsTrainings) >= count($thisStudentsPayments) * 2) {
// They are at their limit of trainings based on their payments!
// Note we include >= so that if they have purchased 2 trainings,
// this blocks them from a 3rd until they pay again.
}这应该能解决你的问题。然而,你没有问,但我想你不希望一个学生允许培训,如果他们已经用完了一笔钱。如果他们接受了训练,并且“花光了自己的信用”,就不应该允许他们参加培训。如果这对你来说很重要,我建议在你的程序的另一部分中,当一笔付款被消耗时,你写到数据库。因此-如果学生使用了2次培训,并且已经支付了这些培训费用,那么可能是 payment model spent上的一个字段(或者表明支付不再有效的东西)。如果不需要历史数据,也可以从系统中删除付款。但是,假设您使用了$payment->spent,您仍然可以执行上面的算法,只需将用过的行添加到查询中,如下所示:
$student = Student::with(['trainings' => function($query){
$query->where('spent', 0)
}])->get();那么剩下的都应该是一样的。这不是剪切和粘贴,但我认为,既然你已经分开付款和培训,这应该是一个很容易解决的解决办法,基于以上的理解。:)
https://stackoverflow.com/questions/58242345
复制相似问题