将结果分块到现有对象

Chunking results onto existing Object

我正面临一个我希望克服的问题。我有一个可以包含许多不同类型数据集的报告。我已经正确设置了所有关系。

在我的 show 函数中,当我需要将此对象传递到前端时,我会这样做

$dataArray = Report::with(['data_set_a', 'data_set_b', 'data_set_c'])
               ->where('user_id', Auth::user()->id)->where('id', $id)->first();

现在在大多数情况下这都可以完美地工作,数据被传递到前端。但是,对于某些报告,data_set_a 有大约 20k 行。在本地这不是问题,但在我的实时系统上没有任何加载。

我检查了日志,mod_security 说 inbound anomaly score exceeded。我想它不喜欢数据集很大并且正在阻止它的事实。

因此,我正在考虑使用分块手动添加此数据集。所以我正在尝试这样的事情

$dataArray = Report::with(['data_set_b', 'data_set_c'])
               ->where('user_id', Auth::user()->id)->where('id', $id)->first();

DataSetA::where('report_id', $report->id)
                ->chunk(500, function($data)  {
                    foreach ($data as $row) {
                            $dataArray['data_set_a'] = array(
                                'cust_id' => $row->cust_id,
                                'colOne' => $row->colOne,
                                'colTwo' => $row->colTwo,
                                'colThree' => $row->colThree
                            );
                        );
                    }
                });

但是,我的语法似乎有问题。如何将这些数据从 data_set_a 分块到 dataArray?

谢谢

您需要将 dataArray 导入到您的块函数中,并将每一行附加到数组,而不是覆盖它:

$dataArray['data_set_a'] = [];
DataSetA::where('report_id', $report->id)
                ->chunk(500, function($data) use ($dataArray)  {
                    foreach ($data as $row) {
                            $dataArray['data_set_a'][] = array(
                                'cust_id' => $row->cust_id,
                                'colOne' => $row->colOne,
                                'colTwo' => $row->colTwo,
                                'colThree' => $row->colThree
                            );
                        );
                    }
                });