【问题标题】:Using Multidimensional array in Laravel 8 Blade在 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'] 吗?

【问题讨论】:

    标签: php mysql laravel laravel-blade laravel-8


    【解决方案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会触发异常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2017-06-18
    • 2021-07-06
    • 2021-10-13
    • 2018-02-14
    • 1970-01-01
    相关资源
    最近更新 更多