首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel代码优化:在Laravel 8中计算特定项目中的任务数

Laravel代码优化:在Laravel 8中计算特定项目中的任务数
EN

Stack Overflow用户
提问于 2022-03-24 15:04:01
回答 2查看 38关注 0票数 -1

如何优化我的Laravel代码?例如,根据任务的状态(已完成、待办、执行)计算特定项目中的任务数。

代码语言:javascript
复制
public function ShowTaskStatus(Project $project)
{
    $tasks = $project->tasks()->get();
    $totaltask = $tasks->count();
    $totaltask_doing = $tasks->where('status', "TODo")->groupBy('status')
        ->map(function ($row) {

            return $row->count();
        });
    $totaltask_todo = $tasks->where('status', "Doing")->groupBy('status')
        ->map(function ($row) {

            return $row->count();
        });
    $totaltask_done = $tasks->where('status', "Done")->groupBy('status')
        ->map(function ($row) {

            return $row->count();
        });

    return [$totaltask, $totaltask_doing, $totaltask_todo, $totaltask_done];
}
EN

回答 2

Stack Overflow用户

发布于 2022-03-24 15:13:58

如果您只需要来自不同类型任务的计数,那么就不要使用get()检索它们。

使用queryBuilder count()方法而不是集合count()方法

代码语言:javascript
复制
public function ShowTaskStatus(Project $project)
{
    $taskCount = $project->tasks()->count();
    $taskToDoCount = $project->tasks()->where('status', "TODo")->count();
    $taskDoingCount = $project->tasks()->where('status', "Doing")->count();
    $taskDoneCount = $project->tasks()->where('status', "Done")->count();
    return [$taskCount,$taskToDoCount, $taskDoingCount, $taskDoneCount];
}

如果只有这些状态,也可以省略$taksCount变量。

代码语言:javascript
复制
public function ShowTaskStatus(Project $project)
{
    $taskToDoCount = $project->tasks()->where('status', "TODo")->count();
    $taskDoingCount = $project->tasks()->where('status', "Doing")->count();
    $taskDoneCount = $project->tasks()->where('status', "Done")->count();
    return [$taskToDoCount + $taskDoingCount + $taskDoneCount, $taskToDoCount, $taskDoingCount, $taskDoneCount];
}

您将注意到在性能上与直接在DB中进行get、计数和计数有很大的不同。特别是当你有很多任务条目的时候。

票数 0
EN

Stack Overflow用户

发布于 2022-03-24 20:54:08

您可以在一个查询中完成此操作;

代码语言:javascript
复制
return $project->tasks()->toBase()
       ->selectRaw(count(*) as total)
       ->selectRaw(count(case when status='TODo'  then 1 end) as todo)
       ->selectRaw(count(case when status='Doing' then 1 end) as doing)
       ->selectRaw(count(case when status='Done'  then 1 end) as done)
       ->first()
       ->values();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71604872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档