基于模型层次结构的Laravel分组
我在这个网站上搜索了大约两天,但没有找到类似的例子。 我正试图用雄辩的语言编写相当于Oracle命令的代码:基于模型层次结构的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
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)。
我只想根据A和B上的约束对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')