2010-07-20 15 views
7

Ich habe Probleme mit diesen Codeblock von doctrine documentationBenötigen Sie verstehen Lehre viele Code viele Selbstreferenzierung helfen

/** @Entity */ 
class User 
{ 
    // ... 

    /** 
    * @ManyToMany(targetEntity="User", mappedBy="myFriends") 
    */ 
    private $friendsWithMe; 

    /** 
    * @ManyToMany(targetEntity="User", inversedBy="friendsWithMe") 
    * @JoinTable(name="friends", 
    *  joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@JoinColumn(name="friend_user_id", referencedColumnName="id")} 
    *  ) 
    */ 
    private $myFriends; 

    // ... 
} 

unten zu entziffern ist, wie ich

alt text http://29.media.tumblr.com/tumblr_l5uwg3VH171qbp1vqo1_r1_500.png

entziffern eine Eins-zu viele bidirektionale Beziehung

aber wenn ich die gleiche Methode verwende, ... unten ist, was ich bekomme

alt text http://img514.imageshack.us/img514/2918/snagprogram0000.png

UPDATE

ich werde meine Frage klären. Grundsätzlich verstehe ich nicht, wie das Gegenteil von myFriends, friendsWithMe ist. Wie kann ich diesen Code verstehen und vor allem wissen, wie ich solche Beziehungen selbst programmieren kann.

Antwort

10

ich gebe einen Versuch, meine Frage zu beantworten, ich bin immer noch ganz mit dieser Unschärfe, hoffe jemand wirklich eine bessere Antwort geben kann,

so 1st die Frage abt zu beantworten wie leite ich mit $friendsWithMe

im Grunde begann ich mit "Decodierung" eine einfachere, häufiger, viele bis viele bidirektionale Beziehung.

  • 1 Benutzer kann
    • $ user-> Gruppen
  • 1 Gruppe in vielen Gruppen sein können viele Benutzer haben
    • $ gruppen-> Benutzer

sehr geradlinig. aber wie macht das in SQL Sinn?

alt text

Code

# select groups user is in 
select group_id from users_groups 
where user_id = 1 

#select users of group 
select user_id from users_groups 
where group_id = 1 

nun zum eigentlichen Modell ... in SQL

alt text

in Code

# select friends of given user 
# $user->myFriends 
select friend_id from friends 
where user_id = 1; 

# select users that are friends of given user 
# $user->friendsWithMe 
select user_id from friends 
where friend_id = 1; 
implementieren

ah ha! Benutzer auswählen, die Freunde des angegebenen Benutzers sind. So bekomme ich $friendsWithMe. dann den & mappedBy & den Rest der Klasse aufzufüllen?

1. Blick auf die untere Note.

alt text

nicht klar, ohne so viel und tiefes Denken, ca. 2 Tage. Ich denke,

dann als Praxis wie erstelle ich eine viele zu viele sich selbst Bezug nehmende Beziehung von Grund auf neu?

Das Beispiel, an dem ich arbeiten werde, ist ... hmm, ziemlich beschissen denke ich aber, ich werde versuchen :) ... 1 Benutzer/Schüler kann viele Lehrer haben. 1 Lehrer kann viele Benutzer/Studenten haben. 1 Benutzer kann hier Lehrer und Schüler sein. Sie wissen wie in Foren wie diesen, wenn Sie Fragen beantworten, sind Sie ein Lehrer. wenn u fragt, sind u Student

die ERD wie

alt text

einige Codes Studenten des Lehrers aussehen zu wählen, und Lehrer des Schülers

# select students of teacher 
# $teacher->students 
select student from teacher_student 
where teacher = 1; 

# select teachers of student 
# $student->teachers 
select teacher from teacher_student 
where student = 2; 

ok, die Lehre Teil ?

/** @Entity @Table(name="users")) */ 
class User { 
    /** 
    * @Id @Column(type="integer") 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
    /** 
    * @Column(type="string", length="30") 
    */ 
    private $name; 
    /** 
    * @ManyToMany(targetEntity="User", inversedBy="teachers") 
    * @JoinTable(name="Teachers_Students", 
    *    joinColumns={@JoinColumn(name="teacher", referencedColumnName="id")}, 
    *    inverseJoinColumns={@JoinColumn(name="student", referencedColumnName="id")} 
    *    ) 
    */ 
    private $students; 
    /** 
    * @ManyToMany(targetEntity="User", mappedBy="students") 
    */ 
    private $teachers; 
} 

, die diese Tabellen für mich

erzeugt
# users 
CREATE TABLE `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(30) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

#teachers_students 
CREATE TABLE `teachers_students` (
    `teacher` int(11) NOT NULL, 
    `student` int(11) NOT NULL, 
    PRIMARY KEY (`teacher`,`student`), 
    KEY `student` (`student`), 
    CONSTRAINT `teachers_students_ibfk_2` FOREIGN KEY (`student`) REFERENCES `users` (`id`), 
    CONSTRAINT `teachers_students_ibfk_1` FOREIGN KEY (`teacher`) REFERENCES `users` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

ich endlich es geschafft! lässt es testen ... ähm ich bin immer

Fatal error: Class 'Entities\User' not found in D:\ResourceLibrary\Frameworks\Doctrine\tools\sandbox\index.php on line 61

wenn ich eine zzz

$user = new User; 

zu tun versuchen ...

i auch abt diese Frage und meine explaination gebloggt habe auf meine tumblr

+0

$ user = new User(); – ruipacheco

+0

+1 Für die Klarheit der Frage und Mühe bei der Vorbereitung zusätzlicher Quellenmaterial – calumbrodie

+1

Hallo. Ich habe mit dieser Beziehung Probleme mit der Lehre bekommen. Wenn ich Elemente zu dieser Art von Sammlung hinzufüge, spüle ich und danach entferne ich alle und spüle erneut. Ich empfange 'Die Klasse 'Doctrine \ ORM \ Persisters \ ManyToManyPersister' wurde nicht in den konfigurierten Namespaces der Kette gefunden. ' Wenn ich Gegenstände entferne, aber mindestens eins lasse, funktioniert alles perfekt. Können Sie dieses Verhalten für mich testen? Und wenn Sie nach der Version der Doktrin, die Sie verwenden, keine Probleme bekommen? Ich werde dankbar sein. –

3

die Frage ist, wobei das M: N Tabelle:

  • friend_user_id
  • user_id

mit zwei Benutzer-ID 1 und 2. Haben Sie nur:

friend_user_id = 1 und user_id = 2

oder beide

friend_user_id = 1 und user_id = 2 user_id = 2 und friend_user_id = 1

Sie können beide Möglichkeiten implementieren, je nachdem, wie Sie die Verwaltung der Sammlung der besitzenden Seite codieren.

Fall A:

public function addFriend(User $friend) 
{ 
    $this->myFriends[] = $friend; 
} 

Fall B:

public function addFriend(User $friend) 
{ 
    $this->myFriends[] = $friend; 
    $friend->myFriends[] = $this; // php allows to access private members of objects of the same type 
} 
+0

auch in Bezug auf Ihr neues Benutzerproblem, müssen Sie verstehen, wie PHP 5.3 Namespace funktioniert, zuerst müssen Sie einen Autoloader für den Namespace "Entities" einrichten, dann müssen Sie auch "use Entities \ User;" in der Lage zu sein, "neuer Benutzer" statt "neuer \ Entitäten \ Benutzer;" – beberlei

+1

in Bezug auf meine Benutzerfehler stellt sich heraus, dass ich nicht eine 'Namespace Entities 'oben auf meine Klasse Erklärung –

+0

gesetzt habe, so kann ich sagen, dass Fall 1 ist eine unidirektionale Beziehung und 2 ein bi? Ich denke tho, dass, wenn ich ein Benutzer eines sozialen Netzwerks bin, wo jeder1 Freunde mit Every1 sein kann, will ich nicht Freund mit Some1 sein, nur becos, fügte er mich als ein Freund hinzu? Ich habe die M: N-Beziehung getestet, die sogar in der Selbstreferenzierung/bidirektionalen Einrichtung, wenn some1 mich als Freund hinzufügt, ich kein Freund mit ihm bin. es scheint, als wäre es eher eine Bequemlichkeit Sache, die ich herausfinden kann, wer sind Freunde mit mir? –