寻找儿童部门的工作人员 - PHP

Geo*_*sis 13 php mysql recursion activerecord codeigniter

我正在使用Codeigniter + MySQL + Active Record构建一个带有组织结构图的项目.

有部门列为组织树,员工信息的人员,员工角色和员工部门,我存储匹配: 部门 - 员工 - 角色

你可以看到下面的结构:

部门 (parent_id用于构建树)

在此输入图像描述

员工 (原始员工信息)

在此输入图像描述

员工角色 (权重最低,层次最高)

在此输入图像描述

员工部门 (在哪个部门 - 谁 - 什么角色)

在此输入图像描述

在稍后阶段,工作人员可能属于具有不同角色的2个或更多部门.这就是为什么我使用单独的表Staff_departments为多对多.在这种情况下,让我们保持简单,并假设1名员工属于1个部门.

我想做什么:

  1. 一个经理(角色重量= 0 || ROLE_ID = 1)在一处,可以查看员工谁在他的工作部(员工和主管)从是他的处儿童部门的所有工作人员(员工和主管).树的深度是未知的.
  2. 主管可以查看仅在其部门工作的员工(仅限员工).
  3. 员工只能自己查看.

对于主管和员工来说,这个过程很简单,所以我觉得我很好.对于Managers来说,我可能需要做一些递归的事情,但每次我开始编写一些代码行时我都在苦苦挣扎.

我的想法是在我的控制器中有一个函数find_related_staff($ staff_id){},我将传递登录的Staff的ID,它将返回一个包含其相关Staff的ID的数组.我唯一得到的是登录的工作人员的身份证.

如果经理返回其部门相关的经理,主管和员工的ID,以及他所在部门的儿童部门的经理,主管和员工.

如果主管仅返回其部门相关的主管和员工的ID.

如果员工退回他的身份证

有关如何实现这一点的任何想法?

小智 3

好吧,我认为,为了让事情更容易理解,我们需要将你的问题分解成小块(我只关注你说你真正需要帮助的部分:经理的递归)。

首先,我们获取与经过身份验证的用户关联的当前部门。正如您所说,您只有当前签署的员工的 ID,因此我们将从该 ID 开始。假设用户 id 被分配给变量 $user_id。

$user_department = $this->db->get_where('staff_departments', ['staff_id' => $user_id])->row();
Run Code Online (Sandbox Code Playgroud)

现在我们有了部门,我们检查该部门中用户的角色是什么。我们将该信息添加到 $user_department 对象中:

$user_department->role = $this->db->get_where('staff_roles', ['role_id' => $user_department->role_id])->row();
Run Code Online (Sandbox Code Playgroud)

让我们检查一下用户角色的权重,好吗?如果它是 0,我们就知道这是该部门的经理,因此我们将递归地查找嵌套的部门及其员工信息。根据您的逻辑指示,我们还可以在此处检查用户是否是主管,并在必要时升级。像这样:

if ($user_department->role->role_weight <= 1) {
    // the user is a supervisor OR a manager, but both those can see, at least, the current department's staff information
    $user_department->staff = $this->db->get_where('staff_departments', ['department_id' => $user_department->department_id]);

    // now is the user a manager? If so, let's find nested departments
    if ($user_department->role->role_weight === 0) {
        $user_department->childs = $this->getChildDepartmentsAndStaffOf($user_department->department_id);
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您可能注意到的,有一个函数将被递归调用。一定是这样的:

public function getChildDepartmentsAndStaffOf($department_id)
{
    $child_departments = $this->db->get_where('departments', ['parent_id' => $department_id]);

    if (! $child_departments) {
        return null;
    }

    foreach ($child_departments as &$department) {
        $department->staff = $this->db->get_where('staff_departments', ['department_id' => $department->department_id]);

        $department->childs = $this->getChildDepartmentsAndStaffOf($department->department_id);
    }

    return $child_departments;
}
Run Code Online (Sandbox Code Playgroud)

现在,您已经有了您想要的结构。我知道这可能会被重构,但我认为这足以得到你的答案并为你指明正确的道路。

希望我帮了一点忙。