it-swarm.com.de

Doctrine array vs simple_array vs json_array

Ich benutze symfony und doctrine als ORM, in verfügbarem Typ habe ich array, simple_array oder json_array Fragen Sie sich, was der Unterschied zwischen den beiden ist und wann Sie den einen oder anderen verwenden sollten? Haben Sie für jeden einen Schaukasten, um die Unterschiede zu veranschaulichen?

Ich habe simple_array bereits in einigen Anwendungen verwendet, aber ich finde, dass es in formType nicht wirklich gut dargestellt wird ... (Oder ich verwende es vielleicht nicht gut !?)

Um meine Frage zu veranschaulichen, ist hier ein Schaukasten:

Ich habe eine Aufgabe, die ich an bestimmten Wochentagen ausführen muss. Also habe ich TaskEntity mit days Attribut erstellt

Tage wären so:

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

Aber ich habe keine Ahnung, welchen Hexentyp ich wählen soll ...

51
0x1gene

Für Ihr Problem ist simple_array Der richtige Weg, der richtige Weg kann auch sieben Boolesche Felder erzeugen.

Hier ist jedoch ein kleines Vademekum:

Der beste Weg, um zu sehen, wie ein Typ in doctrine) funktioniert, besteht darin, den Code des Typs zu lesen. Dies liegt daran, dass einige Details als selbstverständlich angesehen werden oder in der Dokumentation nicht wirklich erläutert werden.

So können Sie hineingehen

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

finden Sie Ihren Typ und prüfen Sie, ob die Methoden wie gewünscht funktionieren.

Hier einige Details:

simple_array

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

return implode(',', $value);

es ist nur eine implode()/explode() von Elementen, speichert nur die Werte und ist nützlich, weil Sie die Datenbank leicht abfragen können.

array

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

return serialize($value);

ruft PHP zu serialize()/unserialize() auf, es ist schneller als json_array. Betrachtet man den Code, denke ich, funktioniert er auch mit Objekten. Wenn Sie das Feld als Klartext sehen, ist es offensichtlich nicht verständlich.

json_array

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

return json_encode($value);

es ruft json_encode()/json_decode() auf, wenn Sie in das Feld schauen, können Sie ein unformatiertes JSON-Array sehen, aber es ist lesbarer als das serialisierte PHP-Objekt und ist wirklich portabler (JSON gibt es überall).

Update Juni 2018

  • jetzt gibt es eine vollständige und aktuellere Dokumentation hier
  • json_array wird zugunsten des json-Typs nicht mehr empfohlen und nutzt neue Datenbankfunktionen für json-Felder
109

Eine weitere Überlegung: Der effizienteste Weg, eine kleine Menge von Richtig/Falsch-Werten wie die hier dargestellten darzustellen, wäre ein Bitfeld .

Auf diese Weise speichern Sie nur eine Ganzzahl anstelle einer vollständigen Zeichenfolge. Und Sie vermeiden den Codierungs-/Decodierungsaufwand.

Ein gutes Beispiel finden Sie unter https://stackoverflow.com/a/5412214/827254 .

10
Jason Hanley

Wie bereits erwähnt, ist die beste Lösung für Ihr Problem die Verwendung einer Array-Zuordnung vom Typ array oder json_array, Jedoch nichtsimple_array. Der Grund dafür ist, dass die Serialisierungsmethode von simple_array Nur ein Aufruf von implode(',', $array) ist und nur die Werte und nicht die Schlüssel des Arrays beibehält assoziatives Array.

Sie können Ihr Attribut $days Jedoch auch als 0-basiertes Array modellieren (d. H. Montag wäre Null, Dienstag wäre 1 usw.). In diesem Fall würde es funktionieren, da die Deserialisierung mit explode(',', $serialized); ein 0-basiertes Array mit den serialisierten Werten generiert.

1
Luis

Nach der Dokumentation:

Doctrine ORM > Basic Mapping > Doctrine Mapping Types

Sie haben 3 Auswahlmöglichkeiten bezüglich der Array-Daten:

  1. array Typ, der ein SQL-CLOB mit serialize() und unserialize() einem PHP Array zuordnet.

  2. simple_array Typ, der ein SQL-CLOB mit implode() und explode() einem PHP= Array zuordnet, mit einem Komma als Trennzeichen .

    WICHTIG: Verwenden Sie diesen Typ nur, wenn Sie sicher sind, dass Ihre Werte kein , Enthalten können.

  3. json_array Typ, der ein SQL-CLOB mit json_encode() und json_decode() einem PHP Array zuordnet.

Wenn Sie also sicher sind, dass Ihre Array-Werte kein , (Komma) enthalten, verwenden Sie simple_array. Wenn Sie eine einfache Array-Struktur (linear) haben, verwenden Sie array und wenn Sie komplexere Schlüsselwert-Arrays haben, verwenden Sie json_array.

0
Pmpr