php - 验证 Laravel 培训的付款和上限
问题描述
我的目标是,当我为一个学生编码一个payment
. 他(学生)可以按照2 trainings
每次付款。(这是上限 - 1 次付款 = 2 次培训)
例如,在我的“付款”表单中,我对一个学生进行了编码Menier
。
学生有权参加两次培训,(这是上限)
在我的培训形式中:我为学生编码了 2 次培训Menier
。
我的第一个问题:如何将培训次数限制为两次?
(所以,如果我对另一个训练进行编码,它必须阻塞!)
我的第二个问题,如果我为同一个学生编码 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');
}
}
你知道如何解决我的问题吗,我还是 laravel 的初学者。
对于开曼群岛
感谢您的时间。
解决方案
这样做还不错。由于付款与特定培训没有直接关联(即您有一个信用系统),因此您可以通过几个查询轻松完成此操作。
我的第一个问题:如何将训练次数限制为两个?
从基础开始,在数据库中查找该学生的培训次数:
$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!
}
我的第二个问题,如果我为同一个学生编码两次付款。学生有权参加 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.
}
这应该可以解决您的问题。但是,您没有问,但我假设您不希望学生在已经用完付款的情况下允许培训。IE 如果他们接受了培训并且他们已经“花光了他们的学分”,他们不应该被允许参加培训。如果这对您很重要,我建议您在程序的另一部分中,在支付已消费时写入数据库。所以 - 如果一个学生使用了 2 次培训并为他们付费,那么可能是支付模型boolean
上的一个字段(或者表明支付不再有效的东西)。如果您不需要历史数据,您也可以从系统中删除付款。但是,假设你这样做了,并且你使用,你仍然可以执行上述算法,spent
$payment->spent
$student = Student::with(['trainings' => function($query){
$query->where('spent', 0)
}])->get();
那么其余的都应该是一样的。这不是剪切和粘贴,但我认为现在您已经将付款和培训分开,基于上述内容,这应该是一个很容易理解的解决方案。:)
推荐阅读
- assembly - 如何编写一系列 MIPS 指令以将 X 处的浮点数除以 (-4),而不使用任何浮点指令。
- javascript - 如何将视频和画布流发送到使用 RTCPeerConnection 连接的远程客户端?
- r - 如何对齐字符上的一组字符串,每边有给定数量的字符(用“x”替换缺失的字符)?
- mysql - MySQL 将四个表(相关)组合成一个新表,以便我可以导出到 CSV
- r - R中的数据框名称是重复的
- ios - 图片未显示在表格单元格中
- vba - 我可以使用 API 或其他东西来接近 VBA 中的 TRUE RANDOM NUMBER 吗?
- mysql - MYSQL:VIEW的DDL中的字符串几个小时后变成乱码
- python - TypeError: 'float' object is not iterable 尝试获取 GPA 列表的总和和平均值时
- vue.js - 如何使用 Blob URI 在 IE11 中显示 PDF 预览