2016-06-03 5 views
4

Ich bemerkte einige seltsame Dinge mit Doctrine ORM ArrayCollection in einer PostgreSQL-Datenbank (mit diesem in einem Symfony 3-Projekt).Doctrine ORM ArrayCollection in PostgreSQL

Nehmen Sie meine User Klasse mit Rollen, Es wird mit einer Standardrolle ROLE_USER initiiert und muss vom Typ array sein.

class User implements UserInterface, Serializable 
{ 
    /** 
    * @var ArrayCollection 
    * 
    * @ORM\Column(name="roles", type="array") 
    */ 
    private $roles; 

    public function __construct() 
    { 
     $this->roles = new ArrayCollection(); 
     $this->roles->add('ROLE_USER'); 
    } 
} 

Dies wird in der Datenbank wie folgt gespeichert.

O:43:"Doctrine\Common\Collections\ArrayCollection":1:{s:53:"

, die einen Serialization Fehler geben wird, wenn sie als User anmelden versuchen, weil eindeutig Teil des ArrayCollection in der Datenbank fehlt.

Nach googlen für eine Lösung bin ich auf this Github issue gestoßen. Wie ich es verstehe, ist es ein Fehler und Sie können die ArrayCollection in einer PostgreSQL Umgebung nicht verwenden.

Nicht den Typ in der @ORM\Column Tag zu definieren hilft auch nicht, es speichert dann Folgendes in der Datenbank und Symfony kann nicht damit arbeiten, um Rollen abzurufen. Doctrine\Common\Collections\[email protected] Und mit simple_array oder json als Typ nicht zurück ein Objekt so beide

Hat jemand eine Abhilfe oder Lösung geht gar nicht für das? Ich beginne wirklich zu bereuen Wechsel von MySQL zu PostgreSQL

HINWEIS: Der Code funktionierte gut in MySQL, wechselte ich nur Datenbanken.

+0

Was würde normalerweise die JSON aussehen wie in der Datenbank? Die vollständige Zeichenfolge meine ich. –

Antwort

0

Sie können immer Ihren eigenen Zuordnungstyp speziell für ArrayCollection-Eigenschaften erstellen. Die Lehre DBAL docs und ORM cookbook beschreiben, wie man einen schafft. Die Symfony documentation beschreibt, wie man es aktiviert/registriert.

Sie könnte zum Beispiel das Array extrahieren und json codieren es, wenn auf einen DB-Wert-Umwandlungs:

json_encode($value->toArray()) 

Und json-decode und wickeln Sie es zurück in eine Arraycollection, wenn auf einen Wert in PHP konvertieren:

new ArrayCollection(json_decode($value)) 

Aber es ist Ihre Mapping-Typ, können Sie tun, was Sie wollen :)

0

Ich hatte dieses Problem auch selbst, ich bin mir nicht sicher, warum postgresql die serialisierte Zeichenfolge abschneidet, auch wenn das Feld als Text markiert ist. Mein Vorschlag ist, dass Sie den Spaltentyp nach json_array konvertieren, weil postgresql dafür einen nativen Typ hat. Sonst können Sie auch benutzerdefinierte Typen verwenden, die