在 Laravel 8 Blade 中使用多维数组

Posted

技术标签:

【中文标题】在 Laravel 8 Blade 中使用多维数组【英文标题】:Using Multidimensional array in Laravel 8 Blade 【发布时间】:2021-06-09 06:54:23 【问题描述】:

我正在尝试获取某些进程和任务的状态计数,就像待办事项列表任务计数一样。 我当前的数据库看起来像这样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'] 吗?

【问题讨论】:

【参考方案1】:

除非您在查询中使用联接来给出命令并强制结果具有所有可能的状态,否则将在某个时候运行 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'] 一样访问您的状态计数

【讨论】:

我在我的控制器中使用了这个感谢您为我回答和解决问题。 //make sure to list all possible statuses here $statCount = array( "Completed" => 0, "Processing" => 0, "On-Hold" => 0, ); foreach ($listStats as $listStat) $statCount[$listStat->status] = $listStat->count; 【参考方案2】:

计数是一项非常轻量级的工作,可以轻松地在运行中完成。无需创建额外的查询来计算记录,而是收集记录并在 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();

【讨论】:

您好,感谢您的回答,您的想法看起来不错,但看起来您错过了表格,表格名称为 list_names,模型名称为 ListName。 Itried 你的查询,但我不知道有什么问题。我正在学习 laravel,有很多不同的问题要了解我。你能用正确的表名重写它吗?另外 user_id 已经存在于 list_names 表中,所以我们不能用它来代替它。或者是否有任何默认功能可以自动考虑 user_id。请帮助我理解它。 :) 如果您正确地在用户表和任务表之间创建了 eloquent 关系,则表名将变得无关紧要。我使用'tasks'作为关系名称,只需将其替换为真实名称,如with(['relationsName'] => function...)$user->relationsName->Completed->count(); 不行,关系回调方法中的groupBy会触发异常

以上是关于在 Laravel 8 Blade 中使用多维数组的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 5.4 刀片中通过键从多维数组中获取值

将数组发送到 Blade 组件(Laravel 8)

在 Laravel 8 Jetstream 的 Blade 组件中绑定 Livewire 属性

使用 Laravel 8(和 Jetstream)将自定义数据传递到 login.blade.php

Laravel 8.65 验证错误消息和旧值未显示在 Blade 文件中

如何将数组从 Laravel Blade 传递到 Laravel 6/Vue 2.6 中的 Vue 组件。*