Массив доктрины против простого массива против массива 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
);

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

Author: 0x1gene, 2013-05-16

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 года

  • теперь здесь есть полная и более обновленная документация
  • json_array устарел в пользу типа json, он будет использовать новые функции базы данных для полей json
 99
Author: Marino Di Clemente, 2018-06-30 10:05:26

Еще одно соображение: Наиболее эффективным способом представления небольшого набора истинных/ложных значений, подобных представленным здесь, было бы битовое поле .

Таким образом, вы сохраняете только одно целое число вместо полной строки. И вы избегаете накладных расходов на кодирование/декодирование.

См. https://stackoverflow.com/a/5412214/827254 для хорошего примера.

 9
Author: Jason Hanley, 2017-05-23 11:47:23

Лучшим решением вашей проблемы, как указано, было бы использовать сопоставление массивов типа array или json_array, но не simple_array. Причина в том, что метод сериализации simple_array - это просто вызов implode(',', $array), и он сохранит только значения, а не ключи массива, что недопустимо для вашей ситуации, когда у вас есть ассоциативный массив.

Однако вы также можете смоделировать свой атрибут $days как массив на основе 0 (т.Е. Понедельник будет равен нулю, вторник будет равен 1 и т. Д.). В в этом случае это сработало бы, потому что десериализация с помощью explode(',', $serialized); генерирует массив на основе 0 с сериализованными значениями.

 1
Author: Luis, 2017-04-27 11:18:16

Согласно документации:

Доктрина ОРМ > Базовое отображение > Типы сопоставления доктрин

У вас есть 3 варианта для обработки данных массива:

  1. array Тип, который сопоставляет блок данных SQL с массивом PHP с помощью serialize() и unserialize().

  2. simple_array Тип, который сопоставляет блок данных SQL с массивом PHP с помощью implode() и explode(), с запятой в качестве разделителя.

    ВАЖНО: Используйте этот тип только в том случае, если вы уверены, что ваши значения не могут содержать ,.

  3. json_array Тип, который сопоставляет блок данных SQL с массивом PHP с помощью json_encode() и json_decode().

Итак, если вы уверены, что в ваших значениях массива нет , (запятая), используйте simple_array. Если у вас простая структура массива (линейная), используйте array, а если у вас более сложные массивы ключ-значение, используйте json_array.

 0
Author: Trix, 2016-12-28 12:01:00