Doctrine-Array vs. simple_array vs. json_array

Lesezeit: 4 Minuten

Benutzer-Avatar
0x1gen

Ich benutze Symfony und Doktrin als mein ORM.

Für verfügbare Typen habe ich:

  • Reihe
  • simple_array
  • json_array

Ich frage mich, was der Unterschied zwischen jedem von ihnen ist: Wann verwende ich das eine oder das andere?

Kann ich für jeden von ihnen eine Demonstration haben, um die Unterschiede zu veranschaulichen?

Ich verwende simple_array bereits in einigen Anwendungen, aber ich verstehe formType nicht … (Oder vielleicht benutze ich es nicht gut!? )

Um meine Frage zu illustrierenHier ist ein Beispiel:

Ich habe eine Aufgabe, die ich an bestimmten Tagen ausführen muss, also habe ich sie erstellt TaskEntity mit Tage Attribut

Tage wären:

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

Aber ich habe keine Ahnung, welchen der oben genannten Typen ich wählen soll …

  • wenn du benutzt json_arraydenken Sie nur daran, dass de facto (wegen des Fehlers Doktrin-Projekt.org/jira/browse/DBAL-446) kann es nie sein null auch wenn es deklariert ist nullable=true (wenn die Entität durch Doktrin konstruiert/hydratisiert wird). Um dieses Problem zu umgehen, stets Wert einstellen array() für dein $myJsonArray Eigentum. Ihre Eigenschaftsdefinition wäre also: /* @Column(type="json_array) */ private $myJsonArray = array();. Und prüfen Sie, ob es über eingestellt ist empty($this->myJsonArray) aber nicht null === $this->myJsonArray()

    – Dimitri K

    11. Oktober 2014 um 17:18 Uhr


  • Ein weiterer Link zum gleichen Fehler, der immer noch nicht behoben ist: github.com/doctrine/dbal/issues/1643

    – ar34z

    31. März 2017 um 14:03 Uhr

Benutzer-Avatar
Marino di Clemens

Zu deinem Problem simple_array der richtige Weg ist, kann der richtige Weg auch sieben boolesche Felder erzeugen.

Aber hier ist ein kleines Vademecum:

Der beste Weg, um zu sehen, wie ein Typ in der Doktrin funktioniert, besteht darin, den Code des Typs zu lesen, da es einige Details gibt, die als selbstverständlich angesehen werden oder in der Dokumentation nicht wirklich erklärt werden.

Sie können also hineingehen

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

Finden Sie Ihren Typ und prüfen Sie, ob seine Methoden wie gewünscht funktionieren.

Hier einige Einzelheiten:

simple_array

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

return implode(',', $value);

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

Reihe

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

return serialize($value);

ruft PHP auf serialize()/unserialize()es ist schneller als json_array. Wenn ich mir den Code ansehe, denke ich, dass es auch mit Objekten funktioniert. Wenn Sie das Feld als einfachen Text 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()wenn Sie in das Feld schauen, können Sie ein unformatiertes JSON-Array sehen, aber es ist besser lesbar als das serialisierte Objekt von PHP und wirklich portabler (JSON existiert überall).

Aktualisierung Juni 2018

  • Jetzt gibt es eine vollständige und aktualisierte Dokumentation hier
  • json_array ist zugunsten des json-Typs veraltet, es wird neue Datenbankfunktionen für json-Felder nutzen

Benutzer-Avatar
Jason Hanley

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

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

Siehe https://stackoverflow.com/a/5412214/827254 für ein gutes Beispiel.

Benutzer-Avatar
Luis

Die beste Lösung für Ihr Problem wäre, wie gesagt, die Verwendung einer Array-Zuordnung des Typs array oder json_array aber nicht simple_array. Der Grund dafür ist, dass die Serialisierungsmethode von simple_array ist nur ein Anruf implode(',', $array) und das würde nur die Werte und nicht die Schlüssel des Arrays beibehalten, was für Ihre Situation, in der Sie ein assoziatives Array haben, ungültig ist.

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

Benutzer-Avatar
Pmpr.ir

Laut Dokumentation:

Lehre ORM > Grundlegende Zuordnung > Doctrine-Mapping-Typen

Sie haben 3 Möglichkeiten in Bezug auf Array-Daten:

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

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

    WICHTIG: Verwenden Sie diesen Typ nur, wenn Sie sicher sind, dass Ihre Werte kein a enthalten dürfen ,.

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

Also, wenn Sie sicher sind, dass Sie es nicht haben , (Komma) in Ihren Array-Werten verwenden 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.

1342000cookie-checkDoctrine-Array vs. simple_array vs. json_array

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy