Doctrine array vs simple_array vs json_array
Я использую 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
);
Но я не знаю, какой тип ведьмы выбрать...
Ответы
Ответ 1
Для вашей проблемы simple_array
правильный путь, правильный путь может также создать семь логических полей.
Однако здесь немного vademecum:
Лучший способ увидеть, как тип работает в доктрине, - это прочитать код типа, это потому, что есть несколько деталей, которые считаются само собой разумеющимися или не описаны в документации.
Итак, вы можете войти в
/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/Type.php
найдите свой тип и проверьте, работают ли его методы как хотите.
Вот некоторые подробности:
simple_array
in /vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/SimpleArrayType.php
return implode(',', $value);
это всего лишь implode()
/explode()
элементов, сохраняет только значения и полезно, потому что вы можете легко запросить базу данных.
массив
in /vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/ArrayType.php
return serialize($value);
вызывает PHP до serialize()
/unserialize()
, он быстрее, чем json_array
. Глядя на код, я думаю, он также работает с объектами. Очевидно, если вы видите поле в виде обычного текста, оно неприемлемо.
json_array
in /vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/JsonArrayType.php
return json_encode($value);
он вызывает json_encode()
/json_decode()
, если вы посмотрите в поле, вы можете увидеть неформатированный массив JSON, но он более читабельный, чем сериализованный объект PHP, и действительно более портативен (JSON существует везде).
Ответ 2
Еще одно соображение: наиболее эффективным способом представления небольшого набора значений true/false, таких как представленные здесь, будет bitfield.
Таким образом, вы сохраняете только одно целое, а не полную строку. И вы избегаете служебных данных кодирования/декодирования.
Для хорошего примера см. fooobar.com/questions/10550/....
Ответ 3
Лучшим решением для вашей проблемы, как указано, было бы использовать сопоставление массива типа array
или json_array
, но не simple_array
. Причина в том, что метод сериализации simple_array
- это просто вызов implode(',', $array)
, который сохранил бы только значения, а не ключи массива, что недействительно для вашей ситуации, когда у вас есть ассоциативный массив.
Однако вы можете также смоделировать свой атрибут $days
как массив на основе 0 (т.е. в понедельник будет ноль, вторник будет 1 и т.д.). В этом случае это будет работать, поскольку десериализация с помощью explode(',', $serialized);
создает массив с 0-значным значением с сериализованными значениями.
Ответ 4
В соответствии с Документацией:
Doctrine ORM > Базовое сопоставление > Типы отображения Doctrine
У вас есть 3 варианта регистрации данных массива:
-
array
Тип, который отображает SQL CLOB в массив PHP с помощью serialize()
и unserialize()
.
-
simple_array
Тип, который отображает SQL CLOB в массив PHP с использованием implode()
и explode()
, с запятой в качестве разделителя.
ВАЖНО: Используйте этот тип, только если вы уверены, что ваши значения не могут содержать ,
.
-
json_array
Тип, который отображает SQL CLOB в массив PHP с помощью json_encode()
и json_decode()
.
Итак, если вы уверены, что не имеете ,
(comma) в своих значениях массива, используйте simple_array
. Если у вас простая структура массива (линейная), используйте array
, и если у вас более сложные массивы значений ключа, используйте json_array
.