Doctrine2实体自定义加入
Doctrine2 Entity Custom Joining
我是学说实体的新手,但我有一个用户 table 和一个角色 table,并且这些角色使用位掩码链接到用户。像这样
+----+----------+------+
| id | username | role |
+----+----------+------+
| 1 | admin | 1022 |
+----+----------+------+
+----+------------+------------+
| id | role | permission |
+----+------------+------------+
| 1 | ROLE_ADMIN | 2 |
| 2 | ROLE_DEV | 4 |
+----+------------+------------+
如何设置我的用户实体 class 以加载 User::$roles
属性 以便 Symfony
可以使用 User::getRoles()
函数检索它们?最好通过角色实体的加载和数组。
相当于:
SELECT r.*
FROM user u
LEFT JOIN role r
ON (u.role & r.permission)
WHERE u.id = :id
角色可以存储在一些class中,例如(以下代码视为伪代码,因为):
class Roles
{
static private $roles = array(
'ROLE_ADMIN',
'ROLE_DEV'
);
public static function getRoleName($index)
{
return (isset($roles[$value]) ? $roles[$value] : false);
}
public static function getIndex($value)
{
return array_search($value, $roles);
}
}
如果您需要从数据库中获取,可以在某处生成(查看 doctrine 中的生命周期事件)
然后您可以定义您的自定义映射学说类型 "role"
Custom mapping types
类似这样的东西(未经测试,您必须进行一些检查以确保不会溢出整数大小):
class RoleType extends Type
{
const ROLE_TYPE = 'role';
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
return 'INT'; //your sql type
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
// ensure to requrie your role class in bootstrap
$roles = array();
$index = 0;
while ($value) {
$role = $value & 1;
if ($role && $roleName = Roles::getRoleName($index)) {
$roles[] = $roleName;
}
if ($roleName === false) {
break;
}
$value = $value >> 2;
++$index;
}
return $roles;
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
$roleValue = 0;
foreach ($value as $roleName) {
$role = Roles::getIndex($roleName);
if ($role !== false) {
$roleValue |= pow(2, $role);
}
}
return $roleValue;
}
public function getName()
{
return self::ROLE_TYPE;
}
}
并在 Symfony 中注册类型 Registering Custom Mapping Types
无论如何我认为最好的选择是在用户和角色之间建立关系。
我是学说实体的新手,但我有一个用户 table 和一个角色 table,并且这些角色使用位掩码链接到用户。像这样
+----+----------+------+
| id | username | role |
+----+----------+------+
| 1 | admin | 1022 |
+----+----------+------+
+----+------------+------------+
| id | role | permission |
+----+------------+------------+
| 1 | ROLE_ADMIN | 2 |
| 2 | ROLE_DEV | 4 |
+----+------------+------------+
如何设置我的用户实体 class 以加载 User::$roles
属性 以便 Symfony
可以使用 User::getRoles()
函数检索它们?最好通过角色实体的加载和数组。
相当于:
SELECT r.*
FROM user u
LEFT JOIN role r
ON (u.role & r.permission)
WHERE u.id = :id
角色可以存储在一些class中,例如(以下代码视为伪代码,因为):
class Roles
{
static private $roles = array(
'ROLE_ADMIN',
'ROLE_DEV'
);
public static function getRoleName($index)
{
return (isset($roles[$value]) ? $roles[$value] : false);
}
public static function getIndex($value)
{
return array_search($value, $roles);
}
}
如果您需要从数据库中获取,可以在某处生成(查看 doctrine 中的生命周期事件)
然后您可以定义您的自定义映射学说类型 "role" Custom mapping types
类似这样的东西(未经测试,您必须进行一些检查以确保不会溢出整数大小):
class RoleType extends Type
{
const ROLE_TYPE = 'role';
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
return 'INT'; //your sql type
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
// ensure to requrie your role class in bootstrap
$roles = array();
$index = 0;
while ($value) {
$role = $value & 1;
if ($role && $roleName = Roles::getRoleName($index)) {
$roles[] = $roleName;
}
if ($roleName === false) {
break;
}
$value = $value >> 2;
++$index;
}
return $roles;
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
$roleValue = 0;
foreach ($value as $roleName) {
$role = Roles::getIndex($roleName);
if ($role !== false) {
$roleValue |= pow(2, $role);
}
}
return $roleValue;
}
public function getName()
{
return self::ROLE_TYPE;
}
}
并在 Symfony 中注册类型 Registering Custom Mapping Types
无论如何我认为最好的选择是在用户和角色之间建立关系。