根据嵌套模型的字段对雄辩查询进行排序

Sort an eloquent query based on the field of a nested model

提问人:Marcel Salazar 提问时间:7/25/2023 最后编辑:Marcel Salazar 更新时间:7/25/2023 访问量:52

问:

我有一个雄辩的查询,它以分页的方式为我带来了 10 份报告,其中包含它们各自的交易和合同

            $reports = Report::with([
                "transaccions",
                "status_report",
                "contracts",
            ])
                ->where(function ($query) use ($filter, $dates, $type_report, $dataservice) {
                    $query
                        ->where("type_report", ($dataservice == 'true' ? '<>' : '='), $type_report)
                        ->whereBetween("created_at", [$dates[0], $fechas[count($dates) - 1]])
                        ->whereHas('status_report', function ($q) {
                            $q->whereIn("status", ["VERIFYED"]);
                        })
                        ->where(function ($query) use ($filter) {
                            $query->where("id", "like", '%' . $filter . '%')
                                ->orWhereHas('contracts', function ($query) use ($filter) {
                                    $query->where('contract', 'like', '%' . $filter . '%')
                                        ->orWhereHas("rif", function ($query) use ($filter) {
                                            $query->where("rif", 'like', '%' . $filter . '%');
                                        })
                                        ->orWhere("name", 'like', '%' . $filter . '%');
                                })->orWhereHas('transaccions', function ($query) use ($filter) {
                                    $query->where('ref', 'like', '%' . $filter . '%')
                                        ->orWhere('amount', 'like', '%' . $filter . '%');
                                });
                        });
                })
                ->paginate($length);

此查询显示在另一个函数中处理的结果,并显示如下内容

        {
            "id": 45751,
            "status": "VERIFYED",
            "type_report": "MENSUALITY",
            "nota": "",
            "transaccions": [
                {
                    "id": 46358,
                    "ref": "22380011359",
                    "voucher": false
                }
            ],
            "total": "1,28",
            "contracts": [
                {
                    "name": "PERSON",
                    "contract": "123456",
                    "rif": "1122334455",
                    "status": "ACTIVE"
                }
            ],
            "created_at": "2022-08-26 14:18:00"
        },

这些结果显示在表格中,我希望能够根据 transactions.amount、contracts.contract(或嵌套模型中的任何其他字段)对结果进行排序 但是我找不到方法,我知道你可以这样对嵌套模型进行排序:

             "transaccions" => function ($query) use ($order_by, $order) {
                    $query->orderBy($order_by, $order);
                },

但我需要对所有结果进行排序,因为这只对嵌套对象进行排序,谢谢。

PHP Laravel Laravel-5 雄辩

评论

1赞 Tim Lewis 7/25/2023
你必须坐到桌子上; 不执行任何类型的语法,因此您不能以 .join()with()JOIN ...transactions.amount
0赞 Marcel Salazar 7/25/2023
是的,这就是我所做的,我将查询更改为连接,我能够做到这一点但是现在我的问题是当我按另一个不是的字段排序时,例如它重复了记录>groupBy($order_by, "report.id")->orderBy($order_by, $order)report.idcontracts.contract
0赞 Tim Lewis 7/25/2023
是的,当同时使用 和 或多个连接等时,可能会发生这种情况。您必须调试最终查询,并确定使用哪些联接方法或语句来获取所需的记录(我不是 SQL 专家,因此我个人对此无能为力)->join()->with()select
0赞 Lothric 7/25/2023
@MarcelSalazar如果您使用 对具有嵌套值的查询进行排序,那么我就会明白为什么它会重复一些记录。正如我所设想的那样,一个人可以有多个和.因此,例如,如果使用值进行排序,则可以有 contract 和 .另一个可以有合同.因此,如果您对其进行排序,您将首先复制 - 在第二个之前和之后。您能否展示结果表的外观以及其中显示了哪些值?joinreporttransactionscontractscontractsreport1012report11reportreport
0赞 Marcel Salazar 7/25/2023
@Lothric我不知道如何在这里向您显示结果,但是如果我按具有 5 关联的特定数字进行过滤并按 排序依据,结果是相同的报告重复 5 次report contractscontract

答: 暂无答案