web-dev-qa-db-fra.com

Doctrine array vs simple_array vs json_array

J'utilise symfony et doctrine comme ORM, dans le type disponible j'ai array, simple_array, ou json_array I me demande quelle est la différence entre chacun d'eux? Et quand utiliser l'un ou l'autre? Avez-vous une vitrine pour chacun d'eux pour illustrer les différences?

J'ai déjà utilisé simple_array dans certaines applications mais je le trouve pas vraiment bien rendu dans formType ... (Ou peut-être que je ne l'utilise pas bien !?)

Pour illustrer ma question, voici un exemple:

J'ai une tâche que je dois exécuter certains jours de la semaine. J'ai donc créé TaskEntity avec l'attribut days

Les jours seraient comme ça:

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

Mais je n'ai aucune idée du type de sorcière à choisir ...

51
0x1gene

Pour votre problème, simple_array Est la bonne façon, la bonne façon peut également créer sept champs booléens.

Mais voici un petit vademecum:

La meilleure façon de voir comment fonctionne un type en doctrine est de lire le code du type, car il y a plusieurs détails qui sont pris pour acquis ou qui ne sont pas vraiment expliqués dans la documentation.

Vous pouvez donc entrer dans

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

trouvez votre type et vérifiez si ses méthodes fonctionnent comme vous le souhaitez.

Voici quelques détails:

simple_array

dans /vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/SimpleArrayType.php

return implode(',', $value);

c'est juste une implode()/explode() des éléments, ne stocke que les valeurs et c'est utile car vous pouvez facilement interroger la base de données.

tableau

dans /vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/ArrayType.php

return serialize($value);

appelle PHP à serialize()/unserialize(), c'est plus rapide que json_array. En regardant le code, je pense qu'il fonctionne aussi avec les objets. De toute évidence, si vous voyez le champ en texte brut, il n'est pas compréhensible.

json_array

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

return json_encode($value);

il appelle json_encode()/json_decode(), si vous regardez dans le champ, vous pouvez voir un tableau JSON non formaté mais il est plus lisible que l'objet sérialisé de PHP et est vraiment plus portable (JSON existe partout).

Mise à jour de juin 2018

  • maintenant il y a une documentation complète et plus mise à jour ici
  • json_array est déconseillé en faveur du type json, il tirera parti des nouvelles fonctionnalités de base de données pour les champs json
109

Une autre considération: la façon la plus efficace de représenter un petit ensemble de valeurs vraies/fausses comme celles présentées ici serait un champ de bits .

De cette façon, vous ne stockez qu'un seul entier au lieu d'une chaîne complète. Et vous évitez les frais généraux d'encodage/décodage.

Voir https://stackoverflow.com/a/5412214/827254 pour un bon exemple.

10
Jason Hanley

Comme indiqué, la meilleure solution à votre problème serait d'utiliser un mappage de tableau de type array ou json_array Mais passimple_array. La raison en est que la méthode de sérialisation de simple_array Est juste un appel à implode(',', $array) et qui ne conserverait que les valeurs et non les clés du tableau, donc invalide pour votre situation où vous avez un tableau associatif.

Cependant, vous pouvez également modéliser votre attribut $days Comme un tableau basé sur 0 (c.-à-d. Lundi serait zéro, mardi serait 1, etc.). Dans ce cas, cela fonctionnerait car la désérialisation avec explode(',', $serialized); génère un tableau basé sur 0 avec les valeurs sérialisées.

1
Luis

Selon la documentation:

Doctrine ORM > Basic Mapping > Doctrine Mapping Types

Vous avez 3 choix pour récupérer les données du tableau:

  1. array Type qui mappe un CLOB SQL à un tableau PHP utilisant serialize() et unserialize().

  2. simple_array Type qui mappe un SQL CLOB à un PHP tableau utilisant implode() et explode(), avec une virgule comme délimiteur .

    IMPORTANT: N'utilisez ce type que si vous êtes sûr que vos valeurs ne peuvent pas contenir de ,.

  3. json_array Type qui mappe un SQL CLOB à un tableau PHP utilisant json_encode() et json_decode().

Donc, si vous êtes sûr de ne pas avoir , (Virgule) dans les valeurs de votre tableau, utilisez simple_array. Si vous avez une structure de tableau simple (linéaire), utilisez array et si vous avez des tableaux de valeurs-clés plus complexes, utilisez json_array.

0
Pmpr