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 ...
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:
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.
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.
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
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.
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.
Selon la documentation:
Doctrine ORM > Basic Mapping > Doctrine Mapping Types
Vous avez 3 choix pour récupérer les données du tableau:
array
Type qui mappe un CLOB SQL à un tableau PHP utilisant serialize()
et unserialize()
.
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
,
.
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
.