【问题标题】:Objects made out of database rows由数据库行组成的对象
【发布时间】:2013-11-14 06:18:35
【问题描述】:

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

管理员表

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

$admin 对象(伪)

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

  public function setter() { }

  public function getter() { }

  /* ETC */
}

这部分我真的很清楚,我可以设置、获取和保存(这个函数位于基类中)数据。

现在,当我创建一个包含与另一个表相关的多行的表时应该怎么做。示例:

admin_preveleges 表

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 对象中为它创建一个处理程序?

【问题讨论】:

  • 对 HasMany 关系建模最直接的方法是通过对象上的数组来处理其他事物。但是基于角色的访问控制是一个已解决的问题,那么为什么不使用现有组件而不是滚动自己的组件呢?

标签: php mysql oop object logic


【解决方案1】:

创建一个新类AdminPrivilege

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

  public function setter() { }

  public function getter() { }

  /* ETC */
}

然后在你的控制器类中创建一个名为loadAdminPrivilegesByAdminID($adminID) 的方法。在此方法中,为管理员加载权限,创建 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;
}

【讨论】:

    【解决方案2】:

    由于一个管理员可以拥有多个权限,并且同一个权限可以属于多个管理员,我认为这是一种多对多的关系。我将创建一个包含 AdminID 和 PrivilageId 的第三个表,并且谁具有由这两个组成的组合主键。当您想将权限分配给 Admin 时,您必须在 PrivilageDetails 表中添加一个新行,其中包含要向其添加权限的 AdminId (PrivilageId)。 如果您想查看哪些权限有管理员,您只需在这些表之间进行连接

    【讨论】:

    • 你是对的。我不知何故认为它是一对多的关系。我会这样做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    相关资源
    最近更新 更多