69

我使用 symfony 和教义作为我的 ORM。

对于可用类型,我有:

  • 大批
  • 简单数组
  • json_array

我想知道它们之间的区别是什么:我什么时候使用其中一个?

我可以为他们每个人做一个演示来说明差异吗?

我已经在某些应用程序中使用了 simple_array,但我发现我不理解 formType...(或者我没有很好地使用它!?)

为了说明我的问题,这里有一个例子:

我有一个必须在特定日期运行的任务所以我创建了带有days属性的TaskEntity

天数是:

$days = array(
    1=>true,
    2=>true,
    3=>true,
    4=>true,
    5=>true,
    6=>false,
    7=>false
);

但我不知道选择上述哪种类型......

4

4 回答 4

133

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

然而,这里有一点vademecum:

了解类型在原则中如何工作的最好方法是阅读类型的代码,这是因为有一些细节被认为是理所当然的,或者在文档中没有真正解释。

所以你可以进入

/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. 查看代码我认为它也适用于对象。显然,如果您将该字段视为纯文本,则它是不可理解的。

json_array

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

return json_encode($value);

它调用json_encode()/ json_decode(),如果您查看该字段,您可以看到一个未格式化的 JSON 数组,但它比 PHP 的序列化对象更具可读性,并且确实更便携(JSON 无处不在)。

2018 年 6 月更新

  • 现在这里有一个完整且更新的文档
  • 不推荐使用 json_array 以支持 json 类型,它将利用 json 字段的新数据库功能
于 2013-05-16T19:47:55.807 回答
12

另一个考虑因素:表示一小组真/假值的最有效方法(如此处介绍的值)是bitfield

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

有关一个很好的示例,请参见https://stackoverflow.com/a/5412214/827254

于 2014-06-28T19:19:39.380 回答
3

如前所述,解决您的问题的最佳方法是使用类型为arrayorjson_array不是 simple_array的数组映射。原因是序列化方法simple_array只是一个调用implode(',', $array),它只会保留数组的值而不是键,因此对于您拥有关联数组的情况无效。

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

于 2016-03-15T13:09:10.170 回答
2

根据文档:

Doctrine ORM >基本映射> Doctrine 映射类型

关于数组数据,您有 3 种选择:

  1. arrayserialize()使用和将 SQL CLOB 映射到 PHP 数组的类型unserialize()

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

    重要提示:仅当您确定您的值不能包含,.

  3. json_arrayjson_encode()使用和将 SQL CLOB 映射到 PHP 数组的类型json_decode()

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

于 2016-12-28T12:01:00.847 回答