由数据库行构成的对象

时间:2013-11-03 14:28:40

标签: php mysql oop object logic

每个对象代表数据库中的一行。例如:

管理员表

id, first_name, last_name
1, 'John', 'Doe'

$ admin object(伪)

class admin extends base {
  protected $id;
  protected $first_name;
  protected $last_name;

  public function setter() { }

  public function getter() { }

  /* ETC */
}

这部分对我来说非常清楚,我可以设置,获取和保存(此函数位于基类中)数据。

现在,当我创建一个包含多个与另一个表相关的行的表时,我该怎么办?例如:

admin_preveleges table

id, admin_id, privilege, value
1, 1, 'read_reports', 1
2, 1, 'delete_news', 1
3, 1, 'delete_users', 1

对象看起来怎样?一个对象是否包含John Doe管理员的所有3行?或者我会为John Doe创建3个对象吗?

如何将这些连接到管理对象?

如果我创建3个单独的对象并将它们连接到$ admin对象,我该如何检查此管理员是否具有删除用户的权限?我是否必须遍历所有对象并检查其中一个是否为“delete_users”然后打破循环?

或者我应该忘记将权限表作为对象并在$ admin对象中为它创建一个处理程序?

2 个答案:

答案 0 :(得分:1)

创建新课程AdminPrivilege

class AdminPrivilege extends base {
  protected $id;
  protected $admin_id;
  protected $privlege;
  protected $allowed;

  public function setter() { }

  public function getter() { }

  /* ETC */
}

然后在你的控制器类中创建一个名为loadAdminPrivilegesByAdminID($adminID)的方法。在此方法中,加载admin的权限,创建AdminPrivilege个对象,并将它们作为数组返回,并将数组附加到admin对象。

class admin extends base {
  protected $id;
  protected $first_name;
  protected $last_name;
  protected $privileges; // NEW to attach the privileges of this admin to himself

  public function setter() { }

  public function getter() { }

  public function setPrivileges(array $privileges) {
    $this->privileges = $privileges;
  }

  public function getPrivileges() { 
    return $this->privileges;
  }

  /* ETC */
}

检查管理员是否有特定的权限很容易。在您的控制器类中创建一个新方法checkPrivilege($adminObj, $privilegeName)

public function checkPrivilege($adminObj, $privilegeName) {
  foreach($adminObj->getPrivileges() as $prv) {
    if($prv->privilege != $privilegeName)
      continue;

    return true;
  }

  return false;
}

答案 1 :(得分:1)

由于一个管理员可以拥有许多权限,并且同一个权限可以属于多个管理员,因此我将其视为多对多关系。我将创建一个第3个表,其中包含AdminID和PrivilageId,以及由这两个组成的组合主键。如果要为管理员分配特权,则必须在PrivilageDetails表中添加一个新行,其中包含要添加特权的PrivIge(PrivilageId)的AdminId。 如果你想看看有什么特权管理员,你只需要在这些表之间进行连接 enter image description here