【问题标题】:Codeigniter count associated records between 2 tablesCodeigniter 计数 2 个表之间的关联记录
【发布时间】:2019-12-11 00:40:36
【问题描述】:

我有 2 个数据库表 'super_admin_staff' 和 'super_admin_roles'

员工表的组成如下:

id
name
email
phone
role

角色表的组成如下:

id
role

角色表中的 id 列是唯一的,并且与人员表的“角色”列相关联。

目前我正在使用模型从数据库中获取所有角色:

 function superAdminStaffRoles()
{
    $this->db->select('*');
    $this->db->from('super_admin_roles');


    $query = $this->db->get();

    $result = $query->result();
    return $result;


}

在我的控制器中,我将它传递给我的视图,如下所示:

public function superAdminStaffRoles()
{
    if ($this->isSuperAdmin() != true) {
        $this->loadThis();
    } else {
        $this->load->model('super_admin_staff_model');

        $data['userRecords'] = $this->super_admin_staff_model->superAdminStaffRoles();

        $this->global['pageTitle'] = 'Staff Roles';
        $this->global['pageDesc'] = 'Add or Edit new Staff Roles and Permissions';

        $this->loadViews("super_admin/staff_roles", $this->global, $data, null);
    }
}

然后在我的视图中显示数据,例如:

<tbody>
      <?php
      if (!empty($userRecords)) {
        foreach ($userRecords as $record) {
          ?>
          <tr>


            <td><?php echo $record->role ?></td>
            <td>where want to loop through the association</td>
            <td class="text-center">

              <a class="btn btn-sm btn-info" href="<?php echo base_url() ?>/EditRole/<?php echo $record->id; ?>"><i class="fas fa-edit"></i></a>
              <a class="btn btn-sm btn-danger deleteUser" href="<?php echo base_url() ?>/DeleteRole/<?php echo $record->id; ?>"><i class="fas fa-trash"></i></a>
            </td>
          </tr>
      <?php
        }
      }
      ?>

    </tbody>

如何在模型中获取我需要的其他信息来显示与该角色相关联的员工人数?我想我可能需要加入表格,但我对加入了解不多。

可以在同一个查询中完成吗?

结果应该是这样的:

Staff table

|id  | name    | role |
.......................
|1   | staff1  | 1    |
|2   | staff2  | 1    |
|3   | staff3  | 2    |
|4   | staff4  | 3    |
|5   | staff5  | 3    |

Role Table

|id  | role   |
...............
|1   | role 1 |
|2   | role 2 |
|3   | role 3 |

结果应该是这样的:

|Staff Role | Assigned |
........................
| Role1     | 2        |
| Role2     | 1        |
| Role3     | 2        |

任何帮助表示赞赏

【问题讨论】:

    标签: php database codeigniter join count


    【解决方案1】:

    给你

    首先,你需要连接两个表

    内连接

    $this->db->from('super_admin_staff');
    $this->db->join('super_admin_roles', 'super_admin_staff.role = super_admin_roles.id');
    

    你会得到以下

    |id  | name    | role |id  | role   |
    ......................................
    |1   | staff1  | 1    |1   | role 1 |
    |2   | staff2  | 1    |1   | role 1 |
    |3   | staff3  | 2    |2   | role 2 |
    |4   | staff4  | 3    |3   | role 3 |
    |5   | staff5  | 3    |3   | role 3 |
    

    左连接

    $this->db->from('super_admin_staff');
    $this->db->join('super_admin_roles', 'super_admin_staff.role = super_admin_roles.id', 'left');
    

    你会得到以下

    |id  | name    | role |id  | role   |
    ......................................
    |1   | staff1  | 1    |1   | role 1 |
    |2   | staff2  | 1    |1   | role 1 |
    |3   | staff3  | 2    |2   | role 2 |
    |4   | staff4  | 3    |3   | role 3 |
    |5   | staff5  | 3    |3   | role 3 |
    |6   | staff6  | 0    |null| null   |
    

    分组依据

    然后是分组(这与 select 密切相关,因为 select 子句中的内容必须在 group by 中)。 这里要按角色分组,可以通过 super_admin_staff.role、super_admin_roles.id 或 super_admin_roles.role 分组。 由于您希望输出中的 super_admin_roles.role,我们将其作为分组列。

    使用 COUNT(*) 将返回每个组的行数。

    $this->db->select('super_admin_roles.role as StaffRole, COUNT(*) as Assigned');    
    $this->db->from('super_admin_staff');
    $this->db->join('super_admin_roles', 'super_admin_staff.role = super_admin_roles.id');
    $this->db->group_by('super_admin_roles.role');
    $query = $this->db->get();
    

    【讨论】:

    • 我如何访问这些信息?通过将我的模型代码更改为您提供的代码,它不再使用我在 foreach 循环中的变量,在我的视图中抛出一个未定义的属性:每个变量的 stdClass 错误。目前我将查询返回为$data['userRecords'],然后将每个循环返回为$record,然后访问每个数据库列,如$record-&gt;role$record-&gt;id
    • 没关系,我发现我不知道我应该使用 StaffRole 和 Assigned 来访问数据。重新阅读您的答案后,当您说该组与选择密切相关时,它会单击。我还需要角色表中的 id,所以我也将super_admin_roles.id as role_id 添加到选择中。谢谢
    • 现在我遇到的问题是,如果没有关联的员工,它根本不会显示角色。如果没有分配员工,有没有办法让它显示为 0 的角色?
    • 您需要执行 LEFT JOIN 而不是 INNER JOIN (实际上在我的答案中)。为此,您需要在连接方法中添加一个参数“left”:$this-&gt;db-&gt;join('super_admin_roles', 'super_admin_staff.role = super_admin_roles.id', 'left');here is some documentation about SQL joins
    猜你喜欢
    • 2013-12-27
    • 1970-01-01
    • 2023-03-16
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多