在Laravel中根据条件合并对象

我正在用 Laravel 8 构建一个项目。我需要合并多个对象,但有条件。这是我的最终目标。

{
    "status": "success",
    "code": 200,
    "data": {
        "invoices": [
            {
                "invoice_id": 6366,
                "issue_date": "2020-07-22",
                "invoice_status": "Fully Paid",
                "installment_count": 4,
                "services_total_price": 0,
                "services": [
                    {
                        "invoice_service_name": "Bathroom Pack",
                        "invoice_service_price": 0
                    }
                ],
                "installments": [
                    {
                        "payment_id": 47687,
                        "invoice_id": 6366,
                        "payment_amount": "3900.00",
                        "paid_amount": "3900.00",
                        "outstanding_amount": "0.00",
                        "due_date": "2020-08-25",
                        "installment_status": "Fully Paid"
                    },
                    {
                        "payment_id": 47688,
                        "invoice_id": 6366,
                        "payment_amount": "3900.00",
                        "paid_amount": "3900.00",
                        "outstanding_amount": "0.00",
                        "due_date": "2020-10-26",
                        "installment_status": "Fully Paid"
                    },
                    {
                        "payment_id": 47689,
                        "invoice_id": 6366,
                        "payment_amount": "3900.00",
                        "paid_amount": "2400.00",
                        "outstanding_amount": "1500.00",
                        "due_date": "2020-12-28",
                        "installment_status": "Partially Paid"
                    },
                    {
                        "payment_id": 47690,
                        "invoice_id": 6366,
                        "payment_amount": "3900.00",
                        "paid_amount": "0.00",
                        "outstanding_amount": "3900.00",
                        "due_date": "2021-02-26",
                        "installment_status": "Unpaid"
                    }
                ]
            },
            {
                "invoice_id": 6058,
                "issue_date": "2020-06-12",
                "invoice_status": "Fully Paid",
                "installment_count": 0,
                "services_total_price": null,
                "services": [],
                "installments": [
                    {
                        "payment_id": 41306,
                        "invoice_id": 6058,
                        "payment_amount": "1168.00",
                        "paid_amount": "1168.00",
                        "outstanding_amount": "0.00",
                        "due_date": "2020-06-12",
                        "installment_status": "Fully Paid"
                    }
                ]
            },

我发现的最好方法是;

        $invoices = DB::connection('mysql2')->select(
            'SELECT i.invoice_id,
                        i.issue_date,
                        i.invoice_status,
                        i.issue_date,
                        i.installment_count,
 ic.invoice_course_start_date) AS total_days
                    FROM students AS s
                            JOIN invoices AS i ON s.student_id = i.student_id
                            JOIN invoices_courses AS ic ON i.invoice_id = ic.invoice_id
                            JOIN currencies c on i.currency_id = c.currency_id
                    WHERE s.student_id = 237
ORDER BY i.invoice_id DESC
');

        for ($i = 0; $i < sizeof($invoices); $i++) {
            $invoices[$i]->currency_symbol = utf8_encode($invoices[$i]->currency_symbol)

            $installments = DB::connection('mysql3')->select('SELECT ip.payment_id,
       ip.invoice_id,
       ip.payment_amount,
       ip.paid_amount,
       ip.outstanding_amount,
              ip.due_date,
       IF(ip.outstanding_amount = 0, "Fully Paid", IF(ip.outstanding_amount = ip.payment_amount, "Unpaid" , "Partially Paid")) AS installment_status
FROM invoices_payments AS ip
WHERE payment_type != "deposit"
  AND ip.invoice_id = ?', [$invoices[$i]->invoice_id]);

            $services = DB::connection('mysql3')->select('SELECT invoice_service_name, invoice_service_price
FROM invoices_services
WHERE invoice_id = ?', [$invoices[$i]->invoice_id]);

            $services_total_price = DB::connection('mysql3')->select('SELECT SUM(invoice_service_price) AS total
FROM invoices_services
WHERE invoice_id = ?', [$invoices[$i]->invoice_id]);

            $invoices[$i]->deposit_outstanding = $invoices[$i]->deposit_amount - $invoices[$i]->deposit_paid_amount;
            $invoices[$i]->discount = $invoices[$i]->gross_price - $invoices[$i]->price;
            $invoices[$i]->services_total_price = $services_total_price[0]->total;
            $invoices[$i]->services = $services;
            $invoices[$i]->installments = $installments;

但这需要太长时间。为每张发票发送一个请求数据库太多了。然后我在 SQL 语法中使用 IN。

       ip.invoice_id,
       ip.payment_amount,
       ip.paid_amount,
       ip.outstanding_amount,
              ip.due_date,
       IF(ip.outstanding_amount = 0, "Fully Paid", IF(ip.outstanding_amount = ip.payment_amount, "Unpaid" , "Partially Paid")) AS installment_status
FROM invoices_payments AS ip
WHERE payment_type != "deposit"
  AND ip.invoice_id = ?', [$invoice_ids]);

        $services = DB::connection('mysql3')->select('SELECT invoice_service_name, invoice_service_price
FROM invoices_services
WHERE invoice_id = ?', [$invoice_ids]);

        $services_total_price = DB::connection('mysql3')->select('SELECT SUM(invoice_service_price) AS total
FROM invoices_services
WHERE invoice_id = ?', [$invoice_ids]);

但正如你所注意到的,这给了我所有的分期付款和其他东西。如何合并发票和其他有条件的发票?有没有办法做到这一点?

回答

使用 Eloquent 怎么样:

class Invoice extends Model
{
    // ...
    public function services()
    {
        return $this->hasMany(AppModelsServices::class);
    }

    public function installments()
    {
        return $this->hasMany(AppModelsInstallment::class);
    }

    public function student()
    {
        return $this->belongsTo(AppModelsStudent::class);
    }
    // ...
}

所以你可以像这样访问它:

Invoice::with(['services', 'installments'])->whereHas('student.student_id', 237)->get();

一些动态属性可能作为访问器完成


以上是在Laravel中根据条件合并对象的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>