Массив доктрины против простого массива против массива json
Я использую 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 answers
Для вашей проблемы 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 года
Еще одно соображение: Наиболее эффективным способом представления небольшого набора истинных/ложных значений, подобных представленным здесь, было бы битовое поле .
Таким образом, вы сохраняете только одно целое число вместо полной строки. И вы избегаете накладных расходов на кодирование/декодирование.
См. https://stackoverflow.com/a/5412214/827254 для хорошего примера.
Лучшим решением вашей проблемы, как указано, было бы использовать сопоставление массивов типа array
или json_array
, но не simple_array
. Причина в том, что метод сериализации simple_array
- это просто вызов implode(',', $array)
, и он сохранит только значения, а не ключи массива, что недопустимо для вашей ситуации, когда у вас есть ассоциативный массив.
Однако вы также можете смоделировать свой атрибут $days
как массив на основе 0 (т.Е. Понедельник будет равен нулю, вторник будет равен 1 и т. Д.). В в этом случае это сработало бы, потому что десериализация с помощью explode(',', $serialized);
генерирует массив на основе 0 с сериализованными значениями.
Согласно документации:
Доктрина ОРМ > Базовое отображение > Типы сопоставления доктрин
У вас есть 3 варианта для обработки данных массива:
array
Тип, который сопоставляет блок данных SQL с массивом PHP с помощьюserialize()
иunserialize()
.-
simple_array
Тип, который сопоставляет блок данных SQL с массивом PHP с помощьюimplode()
иexplode()
, с запятой в качестве разделителя.ВАЖНО: Используйте этот тип только в том случае, если вы уверены, что ваши значения не могут содержать
,
. json_array
Тип, который сопоставляет блок данных SQL с массивом PHP с помощьюjson_encode()
иjson_decode()
.
Итак, если вы уверены, что в ваших значениях массива нет ,
(запятая), используйте simple_array
. Если у вас простая структура массива (линейная), используйте array
, а если у вас более сложные массивы ключ-значение, используйте json_array
.