基于模型层次结构的Laravel分组

基于模型层次结构的Laravel分组,laravel,eloquent,Laravel,Eloquent,我在这个网站上搜索了大约两天,但没有找到类似的例子。 我正试图用雄辩的语言编写相当于Oracle命令的代码: select d.code, d.grp, d.cname, sum(d.poso1) from pers_data e, misth_master m, misth_detail d where e.per_emploeeno = m.emp_no and m.misaa = d.misaa and e.per_emploeeno = '04004' and

我在这个网站上搜索了大约两天,但没有找到类似的例子。 我正试图用雄辩的语言编写相当于Oracle命令的代码:

select  d.code, d.grp, d.cname, sum(d.poso1)
from    pers_data e, misth_master m, misth_detail d
where   e.per_emploeeno = m.emp_no
and     m.misaa = d.misaa
and     e.per_emploeeno = '04004'
and     m.year = '2019'
group   by d.code, d.grp, d.cname;
它基本上以分层方式连接3个模型(e-(has_many)->m-(has_many)->d),对第一个和第二个模型应用约束,并对第三个模型的数据进行分组/求和。 结果集是smt,如下所示:

CODE    GRP     CNAME   SUM(POSO1)
----    ---     -----   ----------
153     1       cname1  0
2       0       cname2  3480
2       1       ..      1003,2
162     1       ..      250,8
        5       ..      2464,67
30      4       ..      172,68
102     1       ..      949,08
105     1       ..      37,5
111     1       ..      25
0       0       ..      21600
11      1       cnamen  3976,26
在Laravel中,我已经声明了相关模型(e=与m有关系的员工,d=详细信息)。 经过多次实验,我得出了以下几行代码来实现这一点: (请注意,员工模型有一个全局范围,因此不需要在这段代码中进行约束,即per_Employeeno='04004'是隐含的)

它确实可以工作,但在我看来很复杂,我喜欢简单易读的代码。 我相信有一种巧妙的方法可以用雄辩的口才做到这一点。 可以用更简单的方式写吗

它可以概括为:

A、B、C为3个层次相关模型(A->B->C)。 我只想根据AB上的约束对C的数据进行分组


提前谢谢你

我不是100%理解Oracle语法,但在我看来它是这样的

我将其“翻译”为Laravel的查询生成器:

DB::table('pers_data')
 ->join('misth_master', 'pers_data.per_emploeeno', '=', 'misth_master.emp_no')
 ->join('misth_detail', 'misth_master.misaa', '=', 'misth_detail.misaa')
 ->where('pers_data.per_emploeeno', '=', '04004')
 ->where('misth_master.year', '=', '2019')
 ->select(DB::raw('SUM(misth_detail.poso1) as total'))
 ->groupBy('misth_detail.code', 'misth_detail.grp', 'misth_detail.cname')

事实上,我认为这可能是最干净的方式。Technicaly Eloquent没有group by,您现在只使用DB query builder类,因此您所做的可能是由于数据库的复杂性而得到的最好结果。感谢您的回复,这是joins OK,一个非常简单的group by/sum of a Stroke表的例子。但我尝试使用ORM方法(“等价的…”在Eloquent中),而不是查询生成器。我认为,将模型及其关系声明为类/方法的目的是,您不必再直接查询数据库表,也可以使您的应用程序独立于数据库供应商。我认为使用模型关系会很简单,但显然不是……好吧,我认为您不知道如何使用查询生成器,因为您在问题中使用的是集合,这比在数据库中使用要低得多。Eloquent还不支持相关模型的聚合。
DB::table('pers_data')
 ->join('misth_master', 'pers_data.per_emploeeno', '=', 'misth_master.emp_no')
 ->join('misth_detail', 'misth_master.misaa', '=', 'misth_detail.misaa')
 ->where('pers_data.per_emploeeno', '=', '04004')
 ->where('misth_master.year', '=', '2019')
 ->select(DB::raw('SUM(misth_detail.poso1) as total'))
 ->groupBy('misth_detail.code', 'misth_detail.grp', 'misth_detail.cname')