在Laravel 8 Blade中使用多维数组



我正试图获得一些流程和任务的状态计数,就像待办事项列表任务计数一样。我当前的数据库看起来像这个SQL数据库结构

+----+---------+------------+-------------+---------+------------+---------------------+---------------------+
| 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();

最新更新