Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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 获取一份按月份分组的摘要_Php_Mysql_Laravel_Laravel 5_Eloquent - Fatal编程技术网

Php 获取一份按月份分组的摘要

Php 获取一份按月份分组的摘要,php,mysql,laravel,laravel-5,eloquent,Php,Mysql,Laravel,Laravel 5,Eloquent,我有一个名为gk的表,目前正在运行两个查询。请查看以下查询: Gk::groupBy(DB::raw("MONTH(created_at)")) ->groupBy(DB::raw("YEAR(created_at)")) ->selectRaw('id, user_id, sum(ton) as ton,pl, count(id) as total, sum(w) , created_at') ->with(array('user'=> func

我有一个名为
gk
的表,目前正在运行两个查询。请查看以下查询:

Gk::groupBy(DB::raw("MONTH(created_at)"))
    ->groupBy(DB::raw("YEAR(created_at)"))
    ->selectRaw('id, user_id, sum(ton) as ton,pl, count(id) as total, sum(w) , created_at')
    ->with(array('user'=> function($q){
          $q->select('id', 'userName', 'profilePic');
    }))
    ->where('user_id', $userData[0]->id)
    ->get();
此查询返回每个月的一个小摘要。正如你们所看到的,我正在按月份和年份对结果进行分组。我还有一个查询,它将返回任何给定月份的所有行。 我正在运行类似这样的第二个查询

 $m=Carbon::parse($request->date);
 Gk::where('user_id',$request->user_id)->whereRaw(DB::raw("YEAR(created_at)=$m->year"))->whereRaw(DB::raw("MONTH(created_at)=$m->month"))
   ->orderBy('created_at','desc')
   ->get();
第二个查询返回任何月份的所有行。我在foreach循环中执行第一个查询中返回的所有月份的查询

我正在尝试将这两个查询合并为一个查询,这样我可以按月份和年份获得一组结果,以及该月份的所有详细信息

任何帮助、建议或想法都会非常有用

[注意:对于第二次查询中的日期,此日期是在第一次查询的结果处创建的。


多谢各位

我理解您的问题的方式如下:第二个查询在循环中执行,结果来自第一个查询。是这样吗?在我的回答中,我解释了一种只执行第二个查询一次而不是在循环中执行的方法。您仍然需要执行第一个查询一次

因此,我认为您最好使用Php收集方法:

$results = Gk::where('user_id',$request->user_id)
    ->orderBy('created_at','desc')
    ->get()
    ->groupBy(function (Gk $item) {
        return $item->created_at->format('Y-m');
    });
groupBy
方法必须返回要对元素进行分组的属性。对于这个例子,我认为使用
yyyy-mm
格式就可以了

参考:

编辑:也许您还可以取消orderBy方法调用,因为您正在按以下方式分组:

编辑2:要组合两个查询的信息,可以执行以下操作:


请注意,我在第一个查询中省略了一些选定的列,因为它们在给定的group by中不是唯一的。但是可以在map函数中随意添加任何逻辑。因为我们在
groupBy
之后使用
map()
,所以每次调用
map()
都会收到一个月的项目集合。您可以使用神奇的集合魔法计算所有需要的值,并将查询数量减少到一个。

没有一个可以帮助您解决问题吗?或者结合…嗨,谢谢你提供这么好的学习资源。我正在试着用它,现在还在想办法。。谢谢你的建议是的,没问题;在提出问题之前,尽你所能自己解决它,这比你提出一个好问题得到的+5/+10奖励要多得多。使用
php artisan tinker
,制作简单的集合并首先使用它们,或者编写一个失败的测试并尝试使其不失败。再次感谢您,我尝试了48小时:(希望我会得到一些东西。)我已经更新了我的答案。我认为你必须保留第一个问题。只要有两个不重复的查询,您就不必担心大多数应用程序的性能。您可以将php中的这些信息与收集方法结合起来,或者在显示信息时将它们放在for循环中。我不认为
merge()
是实现此目的所需的方法。哦,在我写作时,我注意到您可以将其简化为一个查询。是的,这正是我所做的;)我将第一个查询的计算转移到php。谢谢,我将这个答案标记为正确,因为它解决了90%的问题。非常感谢你。
$results = Gk::where('user_id',$request->user_id)
    ->get()
    ->groupBy(function (Gk $item) {
        return $item->created_at->format('Y-m');
    });
$results = Gk::where('user_id',$request->user_id)
    ->get()
    ->groupBy(function (Gk $item) {
        return $item->created_at->format('Y-m');
    })->map(function(Collection $rows) {
        return [
            'sum(ton)' => $rows->sum('ton'),
            'total' => $rows->count(),
            'sum(w)' => $rows->sum('w'),
            'rows' => $rows
        ];
    );