Цикл For останавливается после первой итерации

#mysql #for-loop #php-7.3 #laravel-6.2

#mysql #for-цикл #php-7.3 #laravel-6.2

Вопрос:

У меня здесь есть цикл for, который останавливает цикл после первого цикла из-за значения $due = 0 . Если значение $due равно чему-либо, кроме 0 , цикл выполняется нормально, и все работает — проблема в том, что это условие всегда должно быть равно нулю. Бьюсь головой об стену на этом. Есть идеи? Вот цикл:

 for ($i = 0; $i < $unpaid->getInvoiceQuantity($customer_id); $i  ) {
        $each_invoice_id = $request->input('invoice_id' . $i);

        $whats_due = DB::table('invoices')
                       ->select('due')
                       ->where('id','=', $request->input('invoice_id' . $i))
                       ->first();

        $invoice_payment_total = $request->input('total' . $i);
        $inv_id_array = array('invoice_id' => $request->input('invoice_id' . $i), 'payment_id' => $payment_id,
                              'no_invoice' => false);
        DB::table('payment_applications')->insert($inv_id_array);

        $due = 0;
        if ($whats_due->due == $invoice_payment_total) {
            $due = 0;
        }
        if ($whats_due->due > $invoice_payment_total) {
            $due = $whats_due->due - $invoice_payment_total;
        }

        $update_array = array('due' => $due);
        DB::table('invoices')->where('id', $request->input('invoice_id' . $i))
          ->update($update_array);

        $payment_application_update_array = array('amount' => $request->input('total' . $i));
        DB::table('payment_applications')->where('invoice_id', $request->input('invoice_id' . $i))
                  ->update($payment_application_update_array);
    }
  

Ответ №1:

Одним из обновлений должно быть изменение количества накладной и уменьшение его $i , поэтому условие цикла больше не выполняется.

Вы должны сохранить значение в переменной, а не вызывать метод каждый раз.

 $quantity = $unpaid->getInvoiceQuantity($customer_id);
for ($i = 0; $i < $quantity; $i  ) {
    // rest of loop
}