【问题标题】:How to write a dynamic number of Eloquent queries in Laravel 5?如何在 Laravel 5 中编写动态数量的 Eloquent 查询?
【发布时间】:2017-06-05 14:51:33
【问题描述】:

(这个问题是基于我的另一个问题here

我的数据库中有四个表:

  1. Users(列iddept_id
  2. Departments(列iddeptStringName
  3. Absences(列iduser_idtype_id
  4. Absence_types(列idstringName

目前Departments 表中有 10 行,Absence_types 表中有 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 |   |   |
+---+---+---+---+

【问题讨论】:

  • 您是否尝试过在您的部门中使用foreach 循环?
  • @PaulSpiegel 我犹豫是否这样做,因为查询是由视图端的图表呈现代码调用的。该代码需要每个查询使用 -> 调用一次实例成员,即上述 Department 调用 10 次
  • 您想要一个查询所有部门?
  • 如果可能的话,是的。类似于 2 维表,列上有 Absence_types,行上有 Departments
  • 你能在你的问题中添加一个示例结果吗?

标签: php mysql laravel


【解决方案1】:

试试这个方法..

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

$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
');

并用查询中的值填充$table

foreach ($data as $row) {
    $table[$row->department][$row->absenceType] = $row->absenceCount
}

现在$table 应该是这样的

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

【讨论】:

    猜你喜欢
    • 2018-08-26
    • 2019-09-21
    • 2020-01-23
    • 2021-12-03
    • 2015-10-19
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多