2012-04-26 8 views
5

Ich bin neu in Doctrine, Mongo und der ODM-Konfiguration und während ich mit dieser Einstellung in ZF1 spiele, versuche ich eine einfache Eins-zu-Viele-Referenz mit einem zu replizieren Zwang. Hier ist die Situation und möchte einige Hinweise, wie dies zu erreichen ist.Doctrine ODM MongoDB - Eine einfache Eins-zu-Viele-Referenz replizieren

Dies ist ein einfacher benutzer> Rollenzuordnung, so in einer SQL-Situation würde ich Tabellen wie folgt:

 
Users 
- id 
- name 
- role_id 

Roles 
- id 
- name 

Dann wird ein Fremdschlüssel auf dem Benutzer eingestellt werden würde ROLE_ID auf die Rolle zur Karte Ich würde. Und beim Löschen einer Rolle würde eine Fremdschlüsseleinschränkung ausgelöst werden, die die Operation stoppt.

Wie könnte ich das gleiche Ziel in Doctrines MongoDB ODM erreichen?

Bisher habe ich mit verschiedenen Arten von Anmerkungen auf der Benutzereinheit einschließlich @ReferenceOne @ReferenceMany mit verschiedenen Kaskaden Optionen gespielt habe ...

Die Wahl mir jetzt links ist @PreUpdate, @PreRemove Lebensereignisse zu implementieren auf der 'Rolle' Entität und dann prüfen, dass keine Benutzer die Rolle verwenden, wenn sie dann auf Update sind, ändern Sie die Referenz zu entsprechen oder zu entfernen werfen Sie eine Ausnahme.

Bin ich hier oder verloren?

Danke,

Si

Antwort

7

Für so etwas wie ich nicht zwei getrennte 'Tabellen', wie würden Sie in SQL haben würde. Sie hätten nur den Rollentyp als Eigenschaft des Benutzers. Und wenn Sie einen Rollentyp entfernen möchten, können Sie einfach das Rollenfeld aller Benutzer mit dieser Rolle bearbeiten.

Aber um Ihre Frage zu beantworten, würde ich tun, es ist so.

Dann würde ich eine Serviceklasse für die Arbeit mit meinem Dokumenten-Manager erstellen.

class RoleService { 
    public function deleteRole(Role $role) { 
     if (!$role->hasUsers()) { 
      // Setup the documentManager either in a base class or the init method. Or if your über fancy and have php 5.4, a trait. 
      $this->documentManager->remove($role); 
      // I wouldn't always do this in the service classes as you can't chain 
      // calls without a performance hit. 
      $this->documentManager->flush(); 
     } 
    } 
} 
+0

Große Antwort, vielen Dank! –

+1

Kein Problem. Ich habe den gleichen Schmerz durchgemacht wie du, als du mit Doktrine angefangen hast. Es ist toll, wenn du den Dreh raus hast! –

+1

Ich denke, es ist wirklich sehr gut. Es macht den Aufbau einer Service-Schicht über die Spitze viel einfacher. Ein kleiner Punkt ist die Rolle :: hasUsers() sollte zurückgegeben werden! $ This-> users-> isEmpty(); um den Booleschen Wert zu invertieren. Vielen Dank für Ihre Hilfe und das funktioniert wie ein Traum. –

Verwandte Themen