【问题标题】:Count Tasks By Department - Laravel Query Builder按部门统计任务 - Laravel 查询构建器
【发布时间】:2022-01-13 14:18:54
【问题描述】:

我是这个主题的新手,

我有一个名为 Users 的表,其中有一列名为 department_id

我有另一个名为 tasks 的表,它有一个名为 user_id 和 completed_at 的列

我想知道每个部门完成了多少任务

请帮我在 laravel 中做

foreach($departments as $department){

            $tasks = DB::table('tasks')
            ->join('users', 'users.id', '=' , 'tasks.user_id')
            ->join('departments', 'departments.id', '=', 'users.department_id')
            ->where([
                ['departments.id', '=', $department->id],
                ['tasks.completed_at', '!=', null]
            ])
            ->select('tasks.id as task')
            ->get();

        }

【问题讨论】:

  • 不知道这个查询构建器的确切 Laravel 语法,但在这种特殊情况下(已经在“部门循环”中)你可能需要(概念上)获取计数(* )。换句话说,选择应该类似于 select('count(*) as totalTask​​sCompleted')。

标签: mysql laravel


【解决方案1】:

使用count() 简单的方式接近您的代码:

foreach($departments as $department){
    $tasks = DB::table('tasks')
    ->join('users', 'users.id', '=' , 'tasks.user_id')
    ->where('users.department_id', $department->id),
    ->where('tasks.completed_at', '!=', null)
    ->count();
    // echo "$department->id : $tasks";
}

【讨论】:

    【解决方案2】:

    您可以像这样选择原始计数

    ...
    ->select(DB::raw('count(tasks.id) as task_count'))
    ...
    

    不要忘记 count 是一个非聚合函数,因此您可以在数据库变量中禁用它或在末尾添加一个 groupBy 方法

    ...
    ->groupBy('departments.id')
    

    这是我的代码版本:

    $departments = DB::table('tasks')
                ->join('users', 'users.id', '=' , 'tasks.user_id')
                ->join('departments', 'departments.id', '=', 'users.department_id')
                ->where([
                    ['departments.id', '=', $department->id],
                    ['tasks.completed_at', '!=', null]
                ])
                ->select('departments.id')
                ->select(DB::raw('count(tasks.id) as task_count'))
                ->groupBy('departments.id')
                ->get();
    
    foreach($departments as $department) {
        //$department->task_count
        //$department->id
    }
    

    别忘了添加 DB Facade

    use Illuminate\Support\Facades\DB;
    

    或者,如果您的 eloquent 配置正确,您可以使用它来代替上面的查询构建器:

    //$user = User::find(1);
    
    foreach($user->departments as $department) {
        $task_count = $department
            ->tasks
            ->map(fn($task) $task->completed_at != null)
            ->count();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-30
      • 2021-09-25
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多