【问题标题】:Laravel PHP: Get values out of Recursion FunctionLaravel PHP:从递归函数中获取值
【发布时间】:2021-08-04 18:13:12
【问题描述】:

我有一个invoice_schedule_table,其结构如下:
id,previous_invoice_schedule_id,due_date
7559, , 01-06-2021
7772, 7559, 15-06-2021
7773, 7772, 20-06-2021

我正在尝试创建一个循环/递归函数,如果我从 UI 打开任何发票计划(ID:7559、7772),最终将返回最后一个到期日期(20-06-2021)。

function latestRescheduledInvoiceSchedule($invoiceScheduleId) {

    $rescheduledPaymentSchedule = InvoiceSchedule::where('previous_invoice_schedule_id', $invoiceScheduleId)->first();

    if(isset($rescheduledPaymentSchedule)) {
        latestRescheduledInvoiceSchedule($rescheduledPaymentSchedule->id);
    }
}

但我无法弄清楚如何在到达最后一条记录后获取该值。

对此有何帮助?

【问题讨论】:

  • 当您达到previous_invoice_schedule_id 为空的记录时,您不能只使用break 吗?

标签: php laravel laravel-5 eloquent


【解决方案1】:

$rescheduledPaymentSchedule 未设置时,您应该检索 due_date 值,在这种情况下,它的 id 为 7773:

function latestRescheduledInvoiceSchedule($invoiceScheduleId) {
    $rescheduledPaymentSchedule = InvoiceSchedule::where('previous_invoice_schedule_id', $invoiceScheduleId)->first();

    if($rescheduledPaymentSchedule) {
        latestRescheduledInvoiceSchedule($rescheduledPaymentSchedule->id);
    } else {
        // There is no further values, retrieve the `due_date` of the current invoiceScheduleId
        $last_record = InvoiceSchedule::find($invoiceScheduleId);
        if ($last_record) {
            $last_due_date = $last_record->due_date;
        }
    }
}

【讨论】:

    【解决方案2】:

    不需要递归函数。您可以使用您选择的循环来获取最新的行,如下所示:

    <?php
    
    
    function latestRescheduledInvoiceSchedule($invoiceScheduleId) {
        $payment_schedule_row = '';
        $rescheduledPaymentSchedule = '';
        do{
            $invoiceScheduleId = $rescheduledPaymentSchedule->id ?? $invoiceScheduleId;
            $payment_schedule_row = $rescheduledPaymentSchedule ?? '';
            $rescheduledPaymentSchedule = InvoiceSchedule::where('previous_invoice_schedule_id', $invoiceScheduleId)->first();
        }while(!empty($rescheduledPaymentSchedule));
    
        
        if(empty($payment_schedule_row)){
            $payment_schedule_row = InvoiceSchedule::find($invoiceScheduleId);
        }
        // rest of the code goes here
        dd($payment_schedule_row);  
    }
    

    【讨论】:

    • 谢谢。像魅力一样工作。事实上,我并没有意识到这可以通过 while 循环来实现。
    • @DebarunPal 太好了。我仍然建议您查看dev.mysql.com/doc/refman/8.0/en/with.html,以使用with recursive cte 方法减少到数据库服务器的往返次数。
    猜你喜欢
    • 2015-03-13
    • 2014-07-21
    • 2019-02-23
    • 2011-05-02
    • 2018-02-21
    • 2021-01-11
    • 2014-08-21
    • 2016-08-17
    • 1970-01-01
    相关资源
    最近更新 更多