Geo*_*sis 13 php mysql recursion activerecord codeigniter
我正在使用Codeigniter + MySQL + Active Record构建一个带有组织结构图的项目.
有部门列为组织树,员工信息的人员,员工角色和员工部门,我存储匹配: 部门 - 员工 - 角色
你可以看到下面的结构:
部门 (parent_id用于构建树)
员工 (原始员工信息)
员工角色 (权重最低,层次最高)
员工部门 (在哪个部门 - 谁 - 什么角色)
在稍后阶段,工作人员可能属于具有不同角色的2个或更多部门.这就是为什么我使用单独的表Staff_departments为多对多.在这种情况下,让我们保持简单,并假设1名员工属于1个部门.
我想做什么:
对于主管和员工来说,这个过程很简单,所以我觉得我很好.对于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)
现在,您已经有了您想要的结构。我知道这可能会被重构,但我认为这足以得到你的答案并为你指明正确的道路。
希望我帮了一点忙。
| 归档时间: |
|
| 查看次数: |
369 次 |
| 最近记录: |