php - Doctrine2实体自定义加入

标签 php mysql symfony doctrine-orm

我是学说实体的新手,但我有一个用户表和一个角色表,并且角色使用位掩码链接到用户。像这样

+----+----------+------+
| id | username | role |
+----+----------+------+
| 1  | admin    | 1022 |
+----+----------+------+

+----+------------+------------+
| id | role       | permission |
+----+------------+------------+
|  1 | ROLE_ADMIN |          2 |
|  2 | ROLE_DEV   |          4 |
+----+------------+------------+

如何设置我的用户实体类来加载 User::$roles 属性,以便 Symfony 可以使用 User::getRoles() 检索它们 功能?最好通过 Role 实体的加载和数组。

等同于:

SELECT r.* 
FROM user u 
   LEFT JOIN role r 
   ON (u.role & r.permission) 
WHERE u.id = :id

最佳答案

角色可以存储在某个类中,例如(将下面的代码视为伪代码,因为):

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 中的生命周期事件)

然后你可以定义你的自定义映射原则类型让我们说“角色” 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

无论如何,我认为最好的选择是在用户和角色之间建立关系。

关于php - Doctrine2实体自定义加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29308720/

相关文章:

MySQL 按同级表中的匹配项数量排序

php - 如何使用 symfony 2.3 在 WebTestCase 中提交无效的选择选项

php - WordPress 中奇怪的自定义函数输出

php - Composer self 更新在 OSX 上失败

mysql - 使用系统日期的 SQL

javascript - Assetic:如何只为开发环境包含 javascript 文件?

php - 如何使用 crontab 执行 Symfony 命令

php - Android App 与 PHP 服务器之间的服务器客户端通信

php - 使用 WordPress 的下拉列表

mysql - DVWA 1.8 - SQL 注入(inject) - 更改用户密码