php – 计算每个状态的行数 – Laravel雄辩

一个名为requests的表,其中包含一个名为status的列,我可以通过HasManyThrough关系访问该表.

该表如下所示:

id | status | request
--------------------------
 1 |   1    | lorem ipsum
 2 |   2    | lorem ipsum
 3 |   1    | lorem ipsum
 4 |   3    | lorem ipsum
 5 |   1    | lorem ipsum

我需要以有效的方式计算所有不同的状态行,我正在寻找的结果是这样的:

status | status_count
---------------------
  1    |    3
  2    |    1
  3    |    1

我还需要能够做到这样的事情:

$status[1] Or $status->id[1] // which prints out the count of that status

我知道这两个选项都是丑陋的:

1.使用过滤器:

// Through a table named group which contains year column 
$requests = Auth::user()->requests()->where('year', 2016)->get(); 

$status[1] = $requests->filter(
    function($request){ 
       return  $request->status == 1;
})->count();

现在我有10个状态ID,我应该重复这个代码10次,如果我有100个状态…那么这不是一个好选择.

2.尝试创建正确的sql
据我所知,执行此操作的正确sql语句如下所示:

SELECT 'status', COUNT(*) FROM requests GROUP BY status

为了创建这个声明,我这样做:

$groups = Group::where(['owner_id' => Auth::user()->id, 'year' => 2016])
->lists('id');

$requests = DB::table('requests')
  ->select( DB::raw('count(status) as status_count, status') )
  ->whereIn('group_id', $groups)
  ->groupBy('status')
  ->get();

这是我的dd输出

array:2 [▼
  0 => {
    +"status_count": "3"
    +"status": "1"
  }
  1 => {
    +"status_count": "1"
    +"status": "2"
  }
  2 => {
    +"status_count": "1"
    +"status": "3"
  }
]

我不知道如何使用它们,例如我怎么知道状态2的数量是多少?我可以使用foreach来创建一个以状态为键并将status_counts作为值的数组,但我正在寻找一种正确的方法来执行此操作.

另一件事是如何通过eloquent而不是DB创建这个sql语句?
还有其他方法我错过了吗?

解决方法:

好的,这就是我所做的:

首先,我设法创建一个正确的sql只有雄辩和获得
状态和他们的计数只有1个请求.

这是hasManyThrough关系:

public function requests()
{
    return $this->hasManyThrough('App\Models\Request',
                   'App\Models\Group', 'owner_id', 'group_id');
}

然后获取所需请求状态的计数:

$requests = Auth::user()->requests()->
    select( DB::raw('count(requests.status) as count, requests.status') )->
        groupBy('requests.status')->where('year', '2016')->get();

我们的结果再次完全符合我们的要求:

status | status_count
---------------------
  1    |    3
  2    |    1
  3    |    1

这次我们有两个选项来处理计数,我先用新的一个

1.使用地点:

 // returns null if there is no row with status of 1
$status = $projects->where('status_id', "1")->first();
// if $status is null there is no row with status of 1 so return 0
echo ( empty($status) ) ? 0 : $status->count;

容易吗?但它并不像我们想要的那么干净.

2. foreach技巧:

正如我在我的问题中提到的,我们可以使用foreach来创建一系列状态及其计数.但是当我们尝试获取查询结果中不存在的状态计数时会发生什么?我们将得到一个错误:未定义的偏移量.

这是我的想法:

首先,我们将创建一个数组来保存所有状态代码及其数量
用零填充此数组.

我的系统只有10个状态码,所以:

$requests_counts = array_fill(1, 10, 0); // status 1 to 10 - default count: 0

然后使用foreach语句,我们只覆盖在查询结果中有计数的索引:

foreach($requests as $request)
    $requests_counts[$request->status] = $request->count;

所以所有状态代码都会有一个值,即使是那些不存在的值
我们的查询结果.

*所有状态代码的计数

但是,如果我们想要打印出所有请求的数量,无论它们具有什么状态代码,该怎么办?我们应该创建一个其他查询并计算所有结果行吗?不,我们将使用名为array_sum的函数

array_sum($requests_counts); // prints out number of all requests

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...