2012-11-12 3 views
10

Auf dieser Seite des Zuordnungsmappings gibt es ein Beispiel im Abschnitt vieleTomany. Aber ich verstehe nicht, welche Entität (Gruppe oder Benutzer) die Eigentümerseite ist.Was ist die besitzende Seite und die inverse Seite in der Doktrin? 2 Beispieldokument

http://docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html#many-to-many-bidirectional

ich den Code gesetzt haben auch hier

<?php 
/** @Entity */ 
class User 
{ 
    // ... 

    /** 
    * @ManyToMany(targetEntity="Group", inversedBy="users") 
    * @JoinTable(name="users_groups") 
    */ 
    private $groups; 

    public function __construct() { 
     $this->groups = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    // ... 
} 

/** @Entity */ 
class Group 
{ 
    // ... 
    /** 
    * @ManyToMany(targetEntity="User", mappedBy="groups") 
    */ 
    private $users; 

    public function __construct() { 
     $this->users = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    // ... 
} 

Muss ich diese Anmerkung wie folgt lesen: Mitglied ist mappedBy Gruppen so Gruppe die Einheit, die das Verbindungsmanagement tut, damit die Seite besitzen?

Außerdem habe ich dies in der Dokumentation zu lesen:

For ManyToMany bidirectional relationships either side may be the owning side (the side that defines the @JoinTable and/or does not make use of the mappedBy attribute, thus using a default join table). 

Diese ich denken lassen, dass der Benutzer die besitzende Seite sein würde, wie die JoinTable Anmerkung in dieser Entität definiert ist.

+0

Mögliche Duplikate dieser http://StackOverflow.com/Questions/12493865/what-is-the-difference-between-inversedby-and-mapedby – Developer

Antwort

11

Aber ich verstehe nicht, welche Unternehmen (Gruppe oder Benutzer) ist die besitzende Seite

Die User Einheit der Eigentümer ist. Sie haben die Beziehung von Gruppen in Benutzer:

/** 
* @ManyToMany(targetEntity="Group", inversedBy="users") 
* @JoinTable(name="users_groups") 
*/ 
private $groups; 

siehe oben, $groups var enthält alle Gruppen dieser Benutzer zugeordnet, aber Wenn Sie die Eigenschaft Definition bemerken, $groups var hat den gleichnamigen von mappedBy Wert (mappedBy = "groups"), wie Sie taten:

/** 
* @ManyToMany(targetEntity="User", mappedBy="groups") 
*/ 
private $users; 

Was bedeutet mappedBy?

Diese Option gibt den Eigenschaftsnamen auf der targetEntity an, die die besitzende Seite dieser Beziehung ist.

+2

Perfekte Erklärung – Arsham

12

aus der Dokumentation Genommen:

In einer Eins-zu-Eins-Beziehung das Unternehmen den Fremdschlüssel der bezogenen Unternehmen auf der eigenen Datenbanktabelle ist immer die besitzende Seite der die Beziehung hält.

In einer Viele-zu-Eins-Beziehung ist die Many-Side standardmäßig die Besitzerseite, , weil sie den Fremdschlüssel enthält. Die OneToMany-Seite einer Relation ist standardmäßig , da der Fremdschlüssel auf der Many-Seite gespeichert ist. Eine OneToMany-Beziehung kann nur die besitzende Seite sein, wenn ihre Implementierung eine ManyToMany-Beziehung mit der Join-Tabelle verwendet und die -Seite so einschränkt, dass nur UNIQUE-Werte pro Datenbankbeschränkung zulässig sind.

Jetzt verstehe ich ManyToMany kann manchmal verwirrend sein.

Bei Many-To-Many-Zuordnungen können Sie auswählen, welche Entität Eigentümer und welche die inverse Seite ist. Es gibt eine sehr einfache semantische Regel, um zu entscheiden, welche Seite aus Entwicklerperspektive besser geeignet ist, die besitzende Seite zu sein. Sie müssen sich nur fragen, welche Instanz für das Verbindungsmanagement zuständig ist und diese als Eigentümerseite auswählen.

Nehmen Sie ein Beispiel für zwei Entitäten Artikel und Tag. Wann immer Sie einen Artikel mit einem Tag verbinden möchten und umgekehrt, ist meistens der Artikel für diese Beziehung verantwortlich. Wenn Sie einen neuen Artikel hinzufügen, möchten Sie ihn mit vorhandenen oder neuen Tags verbinden. Ihr createArticle-Formular unterstützt wahrscheinlich diesen Begriff und ermöglicht die direkte Angabe der Tags. Aus diesem Grunde sollten Sie den Artikel als Besitz Seite holen, wie es den Code verständliche macht:

<?php 
class Article 
{ 
    private $tags; 

    public function addTag(Tag $tag) 
    { 
     $tag->addArticle($this); // synchronously updating inverse side 
     $this->tags[] = $tag; 
    } 
} 

class Tag 
{ 
    private $articles; 

    public function addArticle(Article $article) 
    { 
     $this->articles[] = $article; 
    } 
} 

Dies ermöglicht die Gruppe auf dem Artikel Seite des Vereins den Tag hinzufügen:

<?php 
$article = new Article(); 
$article->addTag($tagA); 
$article->addTag($tagB); 

So Kurz gesagt, was auch immer für Sie sinnvoller ist. Sie wählen die besitzende und die inverse Seite der Beziehung.:)

Quelle: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html

+0

Vielen Dank für Ihre Antwort. Ich verstehe, was Sie hier aus den Dokumenten genommen haben .. aber in diesem Artikel-Tag-Beispiel. Wo sollten Sie das Attribut mappedBy platzieren? Können Sie die Anmerkungen bitte hinzufügen? Thx :) – mattyh88

+0

Ich zweite @ mattyh88 Vorschlag. – k0pernikus

+0

vielen Dank, erstaunliche Antwort –

Verwandte Themen