Проверка платежей и потолка тренировок в Ларавеле - PullRequest
0 голосов
/ 04 октября 2019

Моя цель состоит в том, чтобы, когда я кодирую студента для payment. Он (студент) может следовать 2 trainings за платеж . (это потолок - 1 оплата = 2 тренинга)

В моей форме Оплата , я кодирую студента, например Menier.

enter image description here

Студент имеет право на два тренинга (это потолок)

В моей форме Тренировка : я кодирую 2 тренинга для студента Menier.

enter image description here

Мой первый вопрос : как я могу заблокировать количество тренировок на два?

(поэтому, если я закодирую другой тренинг, он должен блокироваться!)

Мой второй квест , если я закодирую 2 платежа для одного и того же ученика. Студент имеет право на 4 тренинга. Как создать алгоритм такого типа?

enter image description here

Вот мой код на данный момент, я знаю, что это не много ...

Редактировать 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.

Для Водяного Каймана

enter image description here enter image description here

Спасибо за вашвремя.

1 Ответ

1 голос
/ 05 октября 2019

Это не так уж плохо, чтобы сделать. Поскольку платеж напрямую не связан с определенным обучением (т. Е. У вас есть кредитная система), вы можете сделать это довольно легко с помощью пары запросов.

Мой первый вопрос: как я могу заблокироватьколичество тренировок на два?

Начните с основ и найдите количество тренировок в базе данных для этого ученика:

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

Тогда все остальное должно быть таким же. Это не так просто, но я думаю, что теперь, когда вы разделили платежи и тренинги, это должно быть довольно легко решить, основываясь на вышеизложенном. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...