个性化阅读
专注于IT技术分析

如何反序列化使用Doctrine存储在数据库中的DC2Type数组数据类型

并非任何数据库引擎(例如MySQL)都知道PHP序列化是什么, 因此你不能在此级别上执行此操作, 这意味着你需要使用PHP进行”是”或”是”操作。准则中的DC2Type字段存储为LONGTEXT类型的字段, 因为MySQL不允许在数据库中存储数组, 但可以在字符串中存储数组。 Doctrine存储在数据库的寄存器中的数据(字符串)示例如下所示:

a:15:{
    i:0;s:32:"ROLE_SONATA_USER_ADMIN_USER_EDIT";
    i:1;s:32:"ROLE_SONATA_USER_ADMIN_USER_LIST";
    i:2;s:34:"ROLE_SONATA_USER_ADMIN_USER_CREATE";
    i:3;s:32:"ROLE_SONATA_USER_ADMIN_USER_VIEW";
    i:4;s:34:"ROLE_SONATA_USER_ADMIN_USER_DELETE";
    i:5;s:36:"ROLE_SONATA_USER_ADMIN_USER_OPERATOR";
    i:6;s:34:"ROLE_SONATA_USER_ADMIN_USER_MASTER";
    i:7;s:33:"ROLE_SONATA_USER_ADMIN_GROUP_EDIT";
    i:8;s:33:"ROLE_SONATA_USER_ADMIN_GROUP_LIST";
    i:9;s:35:"ROLE_SONATA_USER_ADMIN_GROUP_CREATE";
    i:10;s:33:"ROLE_SONATA_USER_ADMIN_GROUP_VIEW";
    i:11;s:35:"ROLE_SONATA_USER_ADMIN_GROUP_DELETE";
    i:12;s:37:"ROLE_SONATA_USER_ADMIN_GROUP_OPERATOR";
    i:13;s:35:"ROLE_SONATA_USER_ADMIN_GROUP_MASTER";
    i:14;s:10:"ROLE_ADMIN";
}

你可能最初认为这必须是一种复杂的格式, 并且只能使用Doctrine进行解码, 但是此字符串只是PHP的序列化功能创建的普通序列化数组。将其视为表示JSON或XML等信息的另一种表示法。

如何解码(转换为PHP数组)

如果你正在使用原则, 并且正在作为实体与数据进行交互, 那么通常如果在Doctrine中已经指定了字段类型, 则实体的getter属性应该返回一个数组。但是, 如果你不是使用Doctrine, 而是使用纯PHP, 则可以使用PHP的反序列化功能将字符串转换为数组。 PHP函数序列化将数据结构序列化为PHP独有的字符串表示形式:

$dc2array = serialize(array("HELLO", "YES"));

// Output: string(36) "a:2:{i:0;s:5:"HELLO";i:1;s:3:"YES";}" 
var_dump($dc2array);

并可以使用反序列化将其反转为PHP对象:

$dc2array = unserialize('a:15:{i:0;s:32:"ROLE_SONATA_USER_ADMIN_USER_EDIT";i:1;s:32:"ROLE_SONATA_USER_ADMIN_USER_LIST";i:2;s:34:"ROLE_SONATA_USER_ADMIN_USER_CREATE";i:3;s:32:"ROLE_SONATA_USER_ADMIN_USER_VIEW";i:4;s:34:"ROLE_SONATA_USER_ADMIN_USER_DELETE";i:5;s:36:"ROLE_SONATA_USER_ADMIN_USER_OPERATOR";i:6;s:34:"ROLE_SONATA_USER_ADMIN_USER_MASTER";i:7;s:33:"ROLE_SONATA_USER_ADMIN_GROUP_EDIT";i:8;s:33:"ROLE_SONATA_USER_ADMIN_GROUP_LIST";i:9;s:35:"ROLE_SONATA_USER_ADMIN_GROUP_CREATE";i:10;s:33:"ROLE_SONATA_USER_ADMIN_GROUP_VIEW";i:11;s:35:"ROLE_SONATA_USER_ADMIN_GROUP_DELETE";i:12;s:37:"ROLE_SONATA_USER_ADMIN_GROUP_OPERATOR";i:13;s:35:"ROLE_SONATA_USER_ADMIN_GROUP_MASTER";i:14;s:10:"ROLE_ADMIN";}');

var_dump($dc2array);

var_dump方法将显示以下数组的结构:

array(15) { 
    [0]=> string(32) "ROLE_SONATA_USER_ADMIN_USER_EDIT" 
    [1]=> string(32) "ROLE_SONATA_USER_ADMIN_USER_LIST" 
    [2]=> string(34) "ROLE_SONATA_USER_ADMIN_USER_CREATE" 
    [3]=> string(32) "ROLE_SONATA_USER_ADMIN_USER_VIEW" 
    [4]=> string(34) "ROLE_SONATA_USER_ADMIN_USER_DELETE" 
    [5]=> string(36) "ROLE_SONATA_USER_ADMIN_USER_OPERATOR" 
    [6]=> string(34) "ROLE_SONATA_USER_ADMIN_USER_MASTER" 
    [7]=> string(33) "ROLE_SONATA_USER_ADMIN_GROUP_EDIT" 
    [8]=> string(33) "ROLE_SONATA_USER_ADMIN_GROUP_LIST" 
    [9]=> string(35) "ROLE_SONATA_USER_ADMIN_GROUP_CREATE" 
    [10]=> string(33) "ROLE_SONATA_USER_ADMIN_GROUP_VIEW" 
    [11]=> string(35) "ROLE_SONATA_USER_ADMIN_GROUP_DELETE" 
    [12]=> string(37) "ROLE_SONATA_USER_ADMIN_GROUP_OPERATOR" 
    [13]=> string(35) "ROLE_SONATA_USER_ADMIN_GROUP_MASTER" 
    [14]=> string(10) "ROLE_ADMIN" 
}

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何反序列化使用Doctrine存储在数据库中的DC2Type数组数据类型

评论 抢沙发

评论前必须登录!