Doctrine数组vs simple_array vs json_array

时间:2013-05-16 12:42:39

标签: php arrays symfony doctrine-orm

我使用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
);

但我不知道巫婆类型可供选择......

4 个答案:

答案 0 :(得分:106)

对于你的问题simple_array是正确的方法,正确的方法也可能创建七个布尔字段。

然而,这里有点vademecum:

查看类型在doctrine中的工作原理的最好方法是读取类型的代码,这是因为有几个细节被认为是理所当然的,或者在文档中没有真正解释过。

所以你可以进入

/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/Type.php

找到您的类型并检查其方法是否可以正常工作。

这里有一些细节:

simple_array

/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快。查看代码我认为它也适用于对象。显然,如果你把这个字段视为纯文本,那就不可挽回了。

json_array

/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/JsonArrayType.php

中的

return json_encode($value);

它调用json_encode() / json_decode(),如果你在该字段中查看,你可以看到一个未格式化的JSON数组,但它比PHP的序列化对象更具可读性,而且实际上更多便携式(JSON随处可见)。

2018年6月更新

  • 现在有一个完整且更新的文档here
  • json_array不赞成使用json类型,它将利用json字段的新数据库功能

答案 1 :(得分:9)

另一个考虑因素:表示一小组真/假值的最有效方式(如此处所示)将为bitfield

这样你只存储一个整数而不是一个完整的字符串。而且你避免了编码/解码开销。

请参阅https://stackoverflow.com/a/5412214/827254以获得一个好例子。

答案 2 :(得分:1)

如上所述,针对您的问题的最佳解决方案是使用类型arrayjson_array simple_array的数组映射。原因是simple_array的序列化方法只是对implode(',', $array)的调用,并且只保留数组而不保留数组的键,因此对于具有关联数组的情况无效。

但是,您也可以将$days属性建模为基于0的数组(即星期一将为零,星期二将为1,等等)。在这种情况下,它会起作用,因为使用explode(',', $serialized);进行反序列化会生成一个带有序列化值的基于0的数组。

答案 3 :(得分:0)

根据文件:

Doctrine ORM> Basic Mapping> Doctrine Mapping Types

您有三种选择来恢复数组数据:

  1. array使用serialize()unserialize()将SQL CLOB映射到PHP数组的类型。

  2. simple_array使用implode()explode()使用逗号作为分隔符将SQL CLOB映射到PHP数组的类型。

      

    重要事项:如果您确定自己的值不能包含,,请仅使用此类型。

  3. json_array使用json_encode()json_decode()将SQL CLOB映射到PHP数组的类型。

  4. 因此,如果您确定数组值中没有,(逗号),请使用simple_array。如果您有一个简单的数组结构(线性),请使用array,如果您有更复杂的键值数组,请使用json_array