Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取laravel 5和mysql中groupby对象的第一个和最后一个值_Php_Mysql_Laravel 5 - Fatal编程技术网

Php 获取laravel 5和mysql中groupby对象的第一个和最后一个值

Php 获取laravel 5和mysql中groupby对象的第一个和最后一个值,php,mysql,laravel-5,Php,Mysql,Laravel 5,我有一张叫做收入的桌子 +----+-------------+---------------------+--------+--------+--------+-----------+---------------------+---------------------+ | id | employee_id | date | gross | income | credit | comission | created_at | updated_

我有一张叫做收入的桌子

+----+-------------+---------------------+--------+--------+--------+-----------+---------------------+---------------------+
| id | employee_id | date                | gross  | income | credit | comission | created_at          | updated_at          |
+----+-------------+---------------------+--------+--------+--------+-----------+---------------------+---------------------+
|  1 |           1 | 2016-03-30 19:21:09 | 100.00 |  29.00 |  11.00 |     60.00 | 2016-03-31 19:21:46 | 2016-03-31 19:21:46 |
|  2 |           1 | 2016-03-31 19:24:44 | 110.00 |  43.00 |   1.00 |     60.00 | 2016-03-31 19:24:56 | 2016-03-31 19:24:56 |
|  3 |           2 | 2016-03-31 21:44:09 |  77.00 |  30.80 |   0.00 |     60.00 | 2016-03-31 21:44:19 | 2016-03-31 21:44:19 |
+----+-------------+---------------------+--------+--------+--------+-----------+---------------------+---------------------+
我要做的是查询这些数据并按
employee\u id
对其进行分组,然后我要它的开始日期和结束日期。我得到的是

$records = Income::whereBetween('date', [$start, $end])
                ->groupBy('employee_id')
                ->selectRaw('store_incomes.* , sum(gross) as total_gross , sum(income) as total_income, sum(credit) as total_credit')
                ->get();
这始终返回该员工的第一个日期。例如,
employee_id 1
始终返回日期
2016-03-30 19:21:09
。我想要的是为每个
员工id
获取第一个和最后一个日期,因此
员工id 1
的开始日期为
2016-30-30
,结束日期为
2016-03-31
。有没有一种方法可以做到这一点而不需要混乱的手动代码

对于当前代码,我的输出是:

[
{"id":"1","employee_id":"1","date":"2016-03-30 19:21:09","gross":"100.00","income":"29.00","credit":"11.00","comission":"60.00","created_at":"2016-03-31 19:21:46","updated_at":"2016-03-31 19:21:46","total_gross":"210.00","total_income":"72.00","total_credit":"12.00"},
{"id":"3","employee_id":"2","date":"2016-03-31 21:44:09","gross":"77.00","income":"30.80","credit":"0.00","comission":"60.00","created_at":"2016-03-31 21:44:19","updated_at":"2016-03-31 21:44:19","total_gross":"77.00","total_income":"30.80","total_credit":"0.00"}
]
我的预期输出包括另外两个值(
start\u date
end\u date
):


您需要的原始MySQL查询大致如下:

SELECT MIN(date) AS start_date, MAX(date) AS end_date, store_incomes.*,
    SUM(gross) AS total_gross , SUM(income) AS total_income, SUM(credit) AS total_credit
FROM income
GROUP BY employee_id
要在Laravel中执行此操作,只需在原始查询中添加
MIN()
MAX()

$records = DB::Income
               ->selectRaw('store_incomes.* , min(date) as start_date, max(date) as end_date, sum(gross) as total_gross , sum(income) as total_income, sum(credit) as total_credit')
               ->groupBy('employee_id')
               ->get();

向我们展示您的预期输出。感谢您的评论。我已编辑以包含所需的输出。只是想知道我是否可以在selectRaw中实现这一点?您是只想要日期还是想要其他信息?如果有两个日期,您的聚合可能没有意义。因为我可能会说3个员工id,然后说我想显示从2月到4月的记录。当我查询时,我希望我的结果按每个员工分组,每个员工在开始日期和结束日期之间的收入。但是,并非所有员工都在同一日期开始,并在同一日期结束。因此,我必须显示每个员工的开始和结束日期。
在两者之间('date',[$start,$end])的目的是什么
那么,如果您为每个员工取最小和最大日期?
$records = DB::Income
               ->selectRaw('store_incomes.* , min(date) as start_date, max(date) as end_date, sum(gross) as total_gross , sum(income) as total_income, sum(credit) as total_credit')
               ->groupBy('employee_id')
               ->get();