【问题标题】:Verification of payments and ceiling of trainings in Laravel验证 Laravel 培训的付款和上限
【发布时间】:2019-10-06 02:56:49
【问题描述】:

我的目标是当我为payment 编码一个学生时。他(学生)可以关注2 trainings每次付款。 (这是上限 - 1 次付款 = 2 次培训)

在我的表单Payment中,我对一个学生进行编码,例如Menier

学生有权参加两次培训,(这是上限)

在我的表单Training中:我为学生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');
    }



}

你知道如何解决我的问题吗,我还是 laravel 的初学者。

对于开曼群岛

感谢您的宝贵时间。

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

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

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

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

    $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 次培训并为他们付费,则可能是 Payment 模型 spent 上的 boolean 字段(或表明付款不再有效的内容)。如果您不需要历史数据,您也可以从系统中删除付款。但是,假设你这样做了,并且你使用$payment-&gt;spent,你仍然可以执行上述算法,只需将花费的行添加到查询中,如下所示:

     $student = Student::with(['trainings' => function($query){
        $query->where('spent', 0)
     }])->get();
    

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

    【讨论】:

    • 首先,感谢您的解释以及您花时间帮助我。我的问题解决了 95%,我已经用我的代码调整了你的代码。实际上,目前,对于付款,我只能通过付款进行 1 次培训……我需要进行 2 次(培训)……但对于其他验证,它们是可以的。我认为问题出在这里?? if( count($thisStudentsPayments) &lt; (count($thisStudentsTrainings) * 2) ) { return redirect()-&gt;route('trainings.index') -&gt;with('error', 'test!'); }我编辑了我的第一条消息
    • 确保$thisStudentsPayments 不为0。IE 确保为正确的学生添加了付款,并且为该学生获取付款的查询从数据库中获取了一个值。如果您为学生创建了付款,$thisStudentsPayments 将至少为 1,然后 if-check 将通过,允许创建培训。
    • 哦,是的,这是您之前的代码:if(count($thisStudentsTrainings) &gt;= 2){...} 如果您不想永远限制为 2 次训练,只需删除整个 if-check 块。
    • 你不需要那个条件。 count($thisStudentsPayments) * 2) &lt; count($thisStudentsTrainings) 将处理针对培训的付款支票。等等 - 你有另一个规则?坚持,稍等。让我编辑 - 我想我明白你的要求了
    • 是的!非常感谢watercayman,它有效,我非常高兴非常感谢!你是最棒的 !!! :-)
    猜你喜欢
    • 1970-01-01
    • 2021-05-15
    • 2017-11-18
    • 2012-04-10
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 2015-11-05
    • 2015-06-19
    相关资源
    最近更新 更多