Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Laravel 5中编写动态数量的雄辩查询?_Php_Mysql_Laravel - Fatal编程技术网

Php 如何在Laravel 5中编写动态数量的雄辩查询?

Php 如何在Laravel 5中编写动态数量的雄辩查询?,php,mysql,laravel,Php,Mysql,Laravel,(这个问题以我的另一个问题为基础) 我的数据库中有四个表: Users(列id,部门id) 部门(列id,deptStringName) 缺勤(列id,用户id,类型id) 缺勤类型(列id,stringName) 目前,部门表中有10行,缺勤类型表中有12行 我试图得到一个查询,该查询输出十个表,每个部门一个,在名称旁边有缺勤类型及其计数,例如IT部门: +-----------+---+ | Sickness | 4 | | Paternity | 7 | | Maternity | 3

(这个问题以我的另一个问题为基础)

我的数据库中有四个表:

  • Users
    (列
    id
    部门id
  • 部门
    (列
    id
    deptStringName
  • 缺勤
    (列
    id
    用户id
    类型id
  • 缺勤类型
    (列
    id
    stringName
  • 目前,
    部门
    表中有10行,
    缺勤类型
    表中有12行

    我试图得到一个查询,该查询输出十个表,每个部门一个,在名称旁边有缺勤类型及其计数,例如IT部门:

    +-----------+---+
    | Sickness  | 4 |
    | Paternity | 7 |
    | Maternity | 3 |
    | ...       | 6 |
    +-----------+---+
    
    我知道获取这些结果的查询。然而,我想知道从软件工程的角度来看,什么是最佳实践:我是否像在下面的查询中那样(
    dept.id=1
    )对
    WHERE
    子句中的值进行了硬编码

    SELECT COUNT(abs.id) as AbsenceCount , absence_types.description FROM Absences abs JOIN Users u on u.id = abs.user_id JOIN Departments dept on dept.id = u.dept_id JOIN Absence_types on Absence_types.id = abs.type_id WHERE dept.id = 1 group by dept.description
    
    还是我用其他方法来获取部门ID?我想不出一种方法,我可以写一个Laravel脚本,知道有多少个部门,然后每个部门运行一个查询

    编辑:示例结果可能与下面的结果类似(理想情况下),X、Y、Z部门的缺勤类型为A、B、C

    +---+---+---+---+
    |   | A | B | C |
    +---+---+---+---+
    | X | 4 | 8 | 5 |
    | Y | 7 | 9 | 4 |
    | Z | 5 |   |   |
    +---+---+---+---+
    
    这样试试

    通过获取所有部门和所有缺勤类型来初始化表:

    $departments  = DB::table('Departments')->pluck('deptStringName');
    $absenceTypes = DB::table('Absence_types')->pluck('stringName');
    
    $row = [];
    foreach ($absenceTypes as $absenceType) {
        $row[$absenceType] = 0;
    }
    
    $table = [];
    foreach ($departments as $department) {
        $table[$department] = $row;
    }
    
    这将创建一个二维阵列,如:

    [
        'X' => [
            'A' => 0,
            'B' => 0,
            'C' => 0,
        ],
        // ...
    ]
    
    如果愿意,可以使用NULL或空字符串代替
    0

    现在稍微修改一下您的查询。您需要按部门和缺勤类型分组

    $data = DB::select('
        SELECT 
            d.deptStringName as department,
            t.stringName as absenceType,
            COUNT(a.id) as absenceCount
        FROM Absences a
        JOIN Users u         ON u.id = a.user_id
        JOIN Departments d   ON d.id = u.dept_id
        JOIN Absence_types t ON t.id = a.type_id
        GROUP BY d.deptStringName, t.stringName
    ');
    
    并用查询中的值填充
    $表

    foreach ($data as $row) {
        $table[$row->department][$row->absenceType] = $row->absenceCount
    }
    
    现在,
    $table
    shlould看起来像

    [
        'X' => [
            'A' => 4,
            'B' => 8,
            'C' => 5,
        ],
        'Y' => [
            'A' => 7,
            'B' => 9,
            'C' => 4,
        ],
        'Z' => [
            'A' => 5,
            'B' => 0,
            'C' => 0,
        ],
    ]
    

    您是否尝试过在您的部门上进行
    foreach
    循环?@PaulSpiegel我犹豫了一下,因为查询是由视图侧的图表渲染代码调用的。该代码要求每个查询使用
    ->
    进行一次实例成员调用,即对上述
    部门进行10次此类调用,您希望对所有部门进行一次查询吗?如果可能,可以。类似于一个列上有缺勤类型和行上有部门的二维表格扫描您是否在问题中添加了一个示例结果?