我使用symfony和doctrine作为ORM,在可用类型中我有数组, simple_array 或 json_array 我想知道他们每个人之间的区别是什么?何时使用其中一个?你有每个展示案例来说明差异吗?
我已经在某些应用程序中使用了simple_array,但我发现它在formType中没有很好地呈现...(或者我可能没有使用它!?)
为了说明我的问题,这是一个展示案例:
我有一个任务,我必须在特定的一周运行 所以我用天属性
创建了 TaskEntity几天就是这样:
$days = array(
1=>true,
2=>true,
3=>true,
4=>true,
5=>true,
6=>false,
7=>false
);
但我不知道巫婆类型可供选择......
答案 0 :(得分:106)
对于你的问题simple_array
是正确的方法,正确的方法也可能创建七个布尔字段。
然而,这里有点vademecum:
查看类型在doctrine中的工作原理的最好方法是读取类型的代码,这是因为有几个细节被认为是理所当然的,或者在文档中没有真正解释过。
所以你可以进入
/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/Type.php
找到您的类型并检查其方法是否可以正常工作。
这里有一些细节:
/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/SimpleArrayType.php
中的
return implode(',', $value);
它只是一个implode()
/ explode()
项,只存储这些值,因为您可以轻松查询数据库,因此非常有用。
/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/ArrayType.php
中的
return serialize($value);
将PHP调用到serialize()
/ unserialize()
,速度比json_array
快。查看代码我认为它也适用于对象。显然,如果你把这个字段视为纯文本,那就不可挽回了。
/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/JsonArrayType.php
中的
return json_encode($value);
它调用json_encode()
/ json_decode()
,如果你在该字段中查看,你可以看到一个未格式化的JSON数组,但它比PHP的序列化对象更具可读性,而且实际上更多便携式(JSON随处可见)。
2018年6月更新
答案 1 :(得分:9)
另一个考虑因素:表示一小组真/假值的最有效方式(如此处所示)将为bitfield。
这样你只存储一个整数而不是一个完整的字符串。而且你避免了编码/解码开销。
请参阅https://stackoverflow.com/a/5412214/827254以获得一个好例子。
答案 2 :(得分:1)
如上所述,针对您的问题的最佳解决方案是使用类型array
或json_array
但不 simple_array
的数组映射。原因是simple_array
的序列化方法只是对implode(',', $array)
的调用,并且只保留数组而不保留数组的键,因此对于具有关联数组的情况无效。
但是,您也可以将$days
属性建模为基于0的数组(即星期一将为零,星期二将为1,等等)。在这种情况下,它会起作用,因为使用explode(',', $serialized);
进行反序列化会生成一个带有序列化值的基于0的数组。
答案 3 :(得分:0)
根据文件:
Doctrine ORM> Basic Mapping> Doctrine Mapping Types
您有三种选择来恢复数组数据:
array
使用serialize()
和unserialize()
将SQL CLOB映射到PHP数组的类型。
simple_array
使用implode()
和explode()
,使用逗号作为分隔符将SQL CLOB映射到PHP数组的类型。
重要事项:如果您确定自己的值不能包含
,
,请仅使用此类型。
json_array
使用json_encode()
和json_decode()
将SQL CLOB映射到PHP数组的类型。
因此,如果您确定数组值中没有,
(逗号),请使用simple_array
。如果您有一个简单的数组结构(线性),请使用array
,如果您有更复杂的键值数组,请使用json_array
。