2014-12-02 5 views
5

Angenommen, ich habe eine Post-Entität und eine Comment-Entität. Ein Kommentar kann von einem Administrator genehmigt werden oder nicht (dies ist ein Flag in der Datenbank). Die Post Einheit hat:Bedingte Beziehung in Symfony2

/** 
* @ORM\OneToMany(targetEntity="Comment", mappedBy="post") 
*/ 
protected $comments; 

Und ich möchte auch ein zweites Attribut, das aussehen wird:

/** 
* @ORM\OneToMany(targetEntity="Comment", mappedBy="post") 
*/ 
protected $approvedComments; 

Wie ist es möglich, hier nur die genehmigten Kommentare zu laden?

+0

Nur nur die zugelassenen laden?Ich verstehe dein Problem nicht wirklich. Kannst du etwas darüber hinausgehen, wie du es lädst? Repository? Regler? – Koalabaerchen

+0

Ich lade momentan die approvedComments nicht, ich frage einen netten Weg, dass das gemacht werden kann. –

Antwort

1

Idee # 1

könnten Sie Inheritance mapping verwenden: http://doctrine-orm.readthedocs.org/en/latest/reference/inheritance-mapping.html

Die Idee wäre für jeden Typ separate Klassen haben (zugelassen und nicht zugelassen), aber alles in einer einzigen Tabelle zu speichern (SINGLE_TABLE Erbe).

Sie benötigen eine zusätzliche Spalte, in der der Klassentypdiskriminator gespeichert wird.

Dann würden Sie haben:

/** 
* @ORM\OneToMany(targetEntity="ApprovedComment", mappedBy="post") 
*/ 
protected $approvedComments; 

/** 
* @ORM\OneToMany(targetEntity="NonApprovedComment", mappedBy="post") 
*/ 
protected $nonApprovedComments; 

Der offensichtliche Nachteil ist, Schaffung von zusätzlichen Klassen.

Idee # 2

Sie könnten nur zwicken Sie Query/QueryBuilder wie:

`SELECT p, c FROM AcmeDemoBundle:Post p LEFT JOIN p.comments c WITH c.approved = FALSE` 

Diese Idee scheint mehr zumutbar ist.

1

Dies kann nicht durch Beziehungen erreicht werden, wie Sie es beschreiben. 2 Tabellen können nicht "bedingt" verwandt werden, da die Beziehungen auf Primärschlüsseln basieren.

Sie haben mindestens Lösungen hier

  1. Lassen Sie das Feld „Bemerkungen“ an der Einheit mit den Anmerkungen, die Anmerkungen aus dem genehmigten Kommentarfeld entfernen, da es die gleichen wie Kommentare, wie durch die ORM verstanden. Sie hätten dann die Funktion -> getComments(), um alle Kommentare zu erhalten, und Sie könnten eine Funktion "getApprovedCommentsForPost ($ post)" in Ihrer Wiederholungsklasse hinzufügen, um die genehmigten zu erhalten.
  2. Sie könnten zwischen Kommentaren mit einfacher Vererbung unterscheiden, also hätten Sie beispielsweise eine Comment-Klasse und eine ApprovedComment-Klasse in einer Tabelle, dann könnten Sie zwei Relationen für Ihre Entität erstellen (lesen Sie hier document-orm.readthedocs.org/en /latest/reference/inheritance-mapping.html#single-table-inheritance)
  3. Sie könnten Lehre Filter verwenden, um nicht genehmigte Kommentare standardmäßig ausfiltern, wenn Daten aus Kommentare Repository
+0

Danke für die bereitgestellten Lösungen, eine Frage, zu der ersten Lösung, die Sie vorschlagen, ein Repository aus einer Entität heraus aufzurufen? Ich denke, das ist nicht gut oder überhaupt möglich. Kannst du erklären, wie? –

+0

Nein, was ich meine ist, dass Sie die Kommentare separat abrufen. So erhalten Sie zuerst das Post-Objekt aus dem Post-Repository und dann, zum Beispiel, in Ihrer Aktion, machen Sie etwas wie $ doctrine-> getRepository ('... Comment') -> getApprovedForPost ($ post) oder -> getApprovedForPosts ($ arrayOfPostIds) –

+0

Aha Ich bekomme es jetzt, aber das wird ein Leistungsproblem erstellen. Da ich viele Beiträge mit ihren genehmigten Kommentaren für eine Seite abrufen möchte. Überprüfen Sie jetzt die anderen beiden Lösungen :) –