Tableau de Doctrine vs tableau simple vs tableau json

J'utilise symfony et doctrine ORM, dans la disposition type {j'ai[2]}tableau, simple_array, ou json_array Je me demande Quelle est la différence entre chacun d'eux ? Et quand utiliser l'un ou l'autre ? Avez-vous un exemple pour chacun d'entre 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 suis pas en utilisant bien!? )

Pour illustrer ma question, voici un afficher la case:

J'ai une tâche que je dois exécuter sur des jours de semaine spécifiques J'ai donc créé TaskEntity avec jours attribut

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 ...

40
demandé sur 0x1gene 2013-05-16 16:42:39

4 réponses

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

Cependant, voici un peu de vademecum:

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

Donc vous pouvez aller 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 un implode()/explode() des éléments, stocke uniquement 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 que cela fonctionne aussi avec des objets. Évidemment, si vous voyez le champ comme du 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 appels 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 obsolète en faveur du type json, il tirera parti des nouvelles fonctionnalités de base de données pour les champs json
99
répondu Marino Di Clemente 2018-06-30 10:05:26

Une autre considération: le moyen le plus efficace de représenter un petit ensemble de valeurs true/false comme celles présentées ici serait un bitfield .

De cette façon, vous ne stockez qu'un 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.

9
répondu Jason Hanley 2017-05-23 11:47:23

La meilleur solution pour votre problème, comme mentionné, pourrait être d'utiliser un tableau de mappage de type array ou json_array, mais pas simple_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'est-à-dire que lundi serait zéro, mardi serait 1, etc.). Dans ce 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
répondu Luis 2017-04-27 11:18:16

Selon la Documentation:

ORM Doctrine > Cartographie de Base > la Doctrine de la Cartographie des Types de

Vous avez 3 choix regaring données de Tableau:

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

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

    IMPORTANT: n'utilisez ce type que si vous sont sûrs que vos valeurs ne peuvent pas contenir un ,.

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

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

0
répondu Trix 2016-12-28 12:01:00