在 Laravel 8 Blade 中使用多维数组

问题描述

我正在尝试获取某些进程和任务的状态计数,就像待办事项列表任务计数一样。 我当前的数据库看起来像这样 SQL Database Structure

+----+---------+------------+-------------+---------+------------+---------------------+---------------------+
| id | user_id | list_id    | name        | records | status     | created_at          | updated_at          |
+----+---------+------------+-------------+---------+------------+---------------------+---------------------+
|  1 |       1 | 8Kwvf8ikcV | 10 mails    | 19      | On-Hold    | 2021-03-11 07:56:17 | 2021-03-11 07:56:17 |
|  2 |       1 | a0pJRv4Zfc | temp_emails | 884     | On-Hold    | 2021-03-11 08:02:13 | 2021-03-11 08:02:13 |
|  3 |       1 | xrgZZkrLFA | 10 mails    | 19      | Processing | 2021-03-11 08:06:37 | 2021-03-11 08:06:37 |
|  4 |       1 | lDOX8p2sgU | 10 mails    | 19      | Completed  | 2021-03-11 08:53:51 | 2021-03-11 08:53:51 |
+----+---------+------------+-------------+---------+------------+---------------------+---------------------+

我正在使用

return $listStats = ListName::select([
            DB::raw("status"),DB::raw("COUNT(status) as count")
        ])->where('user_id',Auth::id())
        ->groupBy('status')
        ->get();

查询获取数据库及其计数。

当前的 Laravel 输出显示[{"status":"Completed","count":1},{"status":"On-Hold","count":2},{"status":"Processing","count":1}]

我的问题是如何在不使用 foreach 循环的情况下获得完成状态的计数? 我需要更改我的查询吗?或者我可以简单地使用 $listStats['Completed']['count'] 吗?

解决方法

除非您在查询中使用连接来给出命令并强制返回具有所有可能状态的结果,否则将在某个时刻运行 foreach。

一个简单的解决方案是

$StatCount[ //make sure to list all possible statuses here
    "Completed" => 0,"Processing" => 0,"On-Hold" => 0,];
foreach ($listStats as $listStat) {
    $StatCount[$listStat->status] = $listStat->count
}

现在您可以像这样访问您的状态计数$statCount['Completed']

,

计数是一项非常轻量级的工作,可以轻松地即时完成。不是创建额外的查询来计算记录,而是收集记录并在 Blade 中计算它们。这是一个更好的主意,因为您无论如何都会获取任务,而无需两次查询它们。

// In controller
$user = User::where('id',Auth::id())->with(['tasks' => function($query) {
  $query->groupBy('status')
}])->get();

return view('viewName')->with(['user',$user]);
// In Blade
$user->tasks->Completed->count();