定义关系并处理其中的数据

时间:2019-08-22 15:56:34

标签: database laravel laravel-5 eloquent

我对人际关系有些困惑,我不确定我是否会分得太多?我正在处理一个报告系统,其中可能有不同类型的reports。因此,我有标准的报告表和模型,并且在模型中定义了一个报告可以具有一种报告类型。

public function reportType() {
    return $this->hasOne('App\ReportType');
}

现在reportType可以是三种不同类型之一,可以将它们称为A,B和C。每种reportType收集不同的数据。因此,在ReportType模型中,我定义了一个与其所拥有的类型具有一种关系

public function reportTypeA() {
    return $this->hasOne('App\ReportTypeA');
}

因此,以上规定reportType可以有一个reportTypeA。在此模型中,我还可以具有一个reportTypeB和C。现在在reportTypeA模型中,我声明reportTypeA可以具有一组reportTypeAData

public function reportTypeAData() {
    return $this->hasOne('App\ReportTypeAData');
}

我在所有模型中都有相反的关系。所以基本上,我有

Report->ReportType->ReportTypeA->ReportTypeAData
                    ReportTypeB->ReportTypeBData
                                 ReportTypeBData2
                    ReportTypeC->ReportTypeCData

原因之所以有数据模型,是因为某些报表具有多个数据集。因此,上面显示了报表B有2组数据,每组都有自己的结构。

因此上述方法有效,但对我来说似乎是“瀑布式”的方法。我会在某个时候清理它,以期使其更有条理。

尽管如此,我还是对上面的方法感到困惑,如何获得报告的数据?所以在我的控制器中,我有类似

$report = Report::where('user_id', Auth::user()->id)->first();

这将使我获得已登录用户的第一份报告。然后,我可以像这样

获取报告数据
$reportData = $report->reportType->reportTypeA->reportTypeAData->all()->toArray();

似乎必须适当处理所有关系。我的主要问题是,我想将数据分块回到前端,所以我会遇到类似的情况

DB::table("report_type_a_data")->chunk(100, function ($data) use ($handle) {
    foreach ($data as $row) {
        // Add a new row with data
        fputcsv($handle, [
            $row->id,
            $row->name
        ]);
    }
});

现在很明显,这将循环所有数据,而我只需要我要处理的报告的数据。此外,当我尝试这样做时,我会收到错误消息

You must specify an orderBy clause when using this function

我为什么要得到这个?非常感谢您对更好地组织事情以及如何处理特定报告数据的任何帮助。

谢谢

1 个答案:

答案 0 :(得分:2)

使用orderBy()时需要chunk()

例如。

DB::table('users')->orderBy('id')->chunk(100, function ($users) {
    foreach ($users as $user) {
        //
    }
});

或者您可以使用chunkById()

DB::table('users')->where('active', false)
    ->chunkById(100, function ($users) {
        foreach ($users as $user) {
            // 
        }
    });

请参阅document