Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Doctrine2实体自定义联接_Php_Mysql_Symfony_Doctrine Orm - Fatal编程技术网

Php Doctrine2实体自定义联接

Php Doctrine2实体自定义联接,php,mysql,symfony,doctrine-orm,Php,Mysql,Symfony,Doctrine Orm,我不熟悉条令实体,但我有一个用户表和一个角色表,角色通过位屏蔽链接到用户。像这样 +----+----------+------+ | id | username | role | +----+----------+------+ | 1 | admin | 1022 | +----+----------+------+ +----+------------+------------+ | id | role | permission | +----+-----------

我不熟悉条令实体,但我有一个用户表和一个角色表,角色通过位屏蔽链接到用户。像这样

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

+----+------------+------------+
| id | role       | permission |
+----+------------+------------+
|  1 | ROLE_ADMIN |          2 |
|  2 | ROLE_DEV   |          4 |
+----+------------+------------+
如何设置用户实体类以加载
User::$roles
属性,以便
Symfony
可以使用
User::getRoles()
函数检索它们?最好是通过加载和数组的角色实体

相当于:

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

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

如果您需要,可以从数据库中的某个地方生成它(查看条令中的生命周期事件)

然后您可以定义自定义映射原则类型,比如“角色”

类似这样的情况(未测试,您必须进行一些检查以避免整数大小溢出):

并在Symfony中注册输入


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

位字段是一种可怕的数据存储方式,尤其是因为屏蔽不可搜索(索引是基于完整值的B-树,而不是单个位)并且无法强制执行引用完整性。如果你绝对必须这么做,那么至少要考虑MySQL的数据类型(它被实现为表面下面的一个位字段,但是提供了一个人性化的API,通过它可以用名称来处理位,并且还可以在连接标准中使用)。
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);
    }
}
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;
    }
}