Подтвердить что ты не робот

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
);

Но я не знаю, какой тип ведьмы выбрать...

4b9b3361

Ответ 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.