Это не так уж плохо, чтобы сделать. Поскольку платеж напрямую не связан с определенным обучением (т. Е. У вас есть кредитная система), вы можете сделать это довольно легко с помощью пары запросов.
Мой первый вопрос: как я могу заблокироватьколичество тренировок на два?
Начните с основ и найдите количество тренировок в базе данных для этого ученика:
$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 тренинга и оплатил их, возможно, поле boolean
в Payment model spent
(или что-то, указывающее, что платеж больше не действителен). Вы также можете удалить платеж из системы, если вам не нужны исторические данные. Но, если вы это сделаете, и вы используете $payment->spent
, вы все равно можете выполнить описанный выше алгоритм, просто добавьте потраченную строку в запрос примерно так:
$student = Student::with(['trainings' => function($query){
$query->where('spent', 0)
}])->get();
Тогда все остальное должно быть таким же. Это не так просто, но я думаю, что теперь, когда вы разделили платежи и тренинги, это должно быть довольно легко решить, основываясь на вышеизложенном. :)