首页 > 解决方案 > 验证 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 的初学者。

对于开曼群岛

在此处输入图像描述 在此处输入图像描述

感谢您的时间。

标签: phplaravellaravel-5

解决方案


这样做还不错。由于付款与特定培训没有直接关联(即您有一个信用系统),因此您可以通过几个查询轻松完成此操作。

我的第一个问题:如何将训练次数限制为两个?

从基础开始,在数据库中查找该学生的培训次数:

$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();

那么其余的都应该是一样的。这不是剪切和粘贴,但我认为现在您已经将付款和培训分开,基于上述内容,这应该是一个很容易理解的解决方案。:)


推荐阅读