2010-07-20 14 views
7

मुझे doctrine documentationकई आत्म संदर्भ कोड में सिद्धांत को समझने में सहायता की आवश्यकता है

/** @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; 

    // ... 
} 

से कोड के इस ब्लॉक को समझने में परेशानी हो रही है, यह है कि मैं कई बिडरेक्शनल रिलेशनशिप

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

पर एक को समझता हूं लेकिन यदि मैं एक ही विधि का उपयोग करता हूं, तो। .. नीचे मुझे

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

अद्यतन

मैं अपने प्रश्न को स्पष्ट करता हूं। मूल रूप से, मैं नहीं समझता कि myFriends, friendsWithMe के विपरीत कैसे है। मैं इस कोड को कैसे समझता हूं और अधिक महत्वपूर्ण रूप से जानता हूं कि इस तरह के रिश्तों को कैसे कोडित किया जाए।

उत्तर

10

मैं अपने प्रश्न का उत्तर देने आजमाइए, मैं कर रहा हूँ अभी भी काफी इस के साथ धुंधला, आशा है कि किसी को वास्तव में एक बेहतर जवाब दे सकते हैं,

तो 1 abt मैं कैसे $friendsWithMe

साथ निकाले जाते हैं सवाल का जवाब देने

मूल रूप से, मैंने "डिकोडिंग" के साथ एक सरल, अधिक आम, कई बिडरेक्शनल रिलेशनशिप के लिए शुरू किया।

  • 1 उपयोगकर्ता कई समूहों में हो सकता है
    • $ उपयोगकर्ता-> समूहों
  • 1 समूह कई उपयोगकर्ताओं
    • $ समूह-> उपयोगकर्ता हो सकते हैं

बहुत सीधे आगे। लेकिन एसक्यूएल में यह कैसे समझ में आता है?

alt text

कोड कोड में अब

# 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 

लागू करने के लिए वास्तविक मॉडल करने के लिए ... एसक्यूएल

alt text

में

# 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; 

आह हे! उन उपयोगकर्ताओं का चयन करें जो दिए गए उपयोगकर्ता के मित्र हैं। इसलिए मैं $friendsWithMe प्राप्त करता हूं। फिर inversedBy & mappedBy & शेष वर्ग को भरने के लिए?

नीचे नोट पर पहली बार देखें।

alt text

बिना इतना और गहरी सोच, 2 दिन abt स्पष्ट नहीं है। मुझे लगता है कि

तो अभ्यास के रूप में मैं स्क्रैच से कई आत्म संदर्भ संबंधों में कितने लोगों को बना सकता हूं?

उदाहरण मैं जिस पर काम करने जा रहा हूं वह है ... हम्म, मुझे लगता है कि काफी परेशान है, लेकिन मैं कोशिश करूंगा :) ... 1 उपयोगकर्ता/छात्र के पास कई शिक्षक हो सकते हैं। 1 शिक्षक के पास कई उपयोगकर्ता/छात्र हो सकते हैं। 1 उपयोगकर्ता यहां एक शिक्षक और छात्र हो सकता है। आप इस तरह के मंचों की तरह जानते हैं, जब आप किसी के सवालों का जवाब देते हैं, तो आप एक शिक्षक होते हैं। जब यू से पूछते हैं, यू एक छात्र

, सिद्धांत हिस्सा हैं

ERD का चयन करने के

alt text

कुछ कोड की तरह दिखाई देगा, शिक्षकों के छात्रों,

# 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; 

ठीक छात्रों के शिक्षकों ?

/** @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; 
} 

जो पिछले मैं यह किया पर के लिए मुझे

# 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 

इस तालिकाओं उत्पन्न! यह परीक्षण ... ईआरएम मैं

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

हो रही है जब मैं एक

$user = new User; 

zzz करने की कोशिश ...

मैं भी इस सवाल abt ब्लॉग किया है और पर अपने explaination की सुविधा देता है मेरी tumblr

+0

$ उपयोगकर्ता = नया उपयोगकर्ता(); – ruipacheco

+0

+1 अतिरिक्त स्रोत सामग्री तैयार करने में प्रश्न और प्रयास की स्पष्टता के लिए – calumbrodie

+1

हैलो। मुझे इस संबंध के साथ सिद्धांत के साथ समस्या मिली। जब मैं उस तरह के संग्रह में आइटम जोड़ता हूं, फ्लश करता हूं और उसके बाद मैं उन सभी को हटा देता हूं और फिर फ्लश करता हूं, मुझे 'क्लास' सिद्धांत प्राप्त होता है \ ORM \ Persisters \ ManyToManyPersister 'चेन कॉन्फ़िगर किए गए नेमस्पेस' में नहीं मिला था। जब मैं वस्तुओं को हटा रहा हूं, लेकिन कम से कम एक सब कुछ पूरी तरह से काम करता है छोड़ दें। क्या आप मेरे लिए इस व्यवहार का परीक्षण कर सकते हैं? और यदि आपको उस सिद्धांत के संस्करण के बाद कोई समस्या नहीं है जिसका आप उपयोग कर रहे हैं? मैं आभारी रहूंगा। –

3

सवाल यह है कि, एम होने: लागू तालिका:

  • friend_user_id

user_id के साथ दो उपयोगकर्ताओं आईडी 1 और 2 आप केवल है:

friend_user_id = 1 और user_id = 2

या दोनों

friend_user_id = 1 और user_id = 2 user_id = 2 और friend_user_id = 1

आप अपने पक्ष के संग्रह के प्रबंधन को कैसे नियंत्रित करते हैं, इस पर निर्भर करते हुए आप दोनों तरीकों को लागू कर सकते हैं।

केस एक:

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

प्रकरण बी:

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

आपके नए उपयोगकर्ता मुद्दे के बारे में भी, आपको समझना होगा कि PHP 5.3 नेमस्पेसिंग कैसे काम करता है, सबसे पहले आपको "संस्थाओं" नामस्थान के लिए एक ऑटोलोडर सेट करना होगा, फिर आपको "संस्थाओं का उपयोग करें \ उपयोगकर्ता" भी कॉल करना होगा; "नई \ संस्थाओं \ उपयोगकर्ता" के बजाय "नया उपयोगकर्ता" करने में सक्षम होने के लिए – beberlei

+1

मेरी उपयोगकर्ता त्रुटि के संबंध में, यह पता चला है कि मैंने अपनी कक्षा घोषणा –

+0

के शीर्ष पर 'नेमस्पेस इकाइयां' नहीं डाली है, इसलिए मैं कह सकता हूं कि केस 1 एक संयुक्त दिशात्मक संबंध है और 2 एक द्विपक्षीय है? मुझे लगता है कि अगर मैं सोशल नेटवर्क का उपयोगकर्ता हूं, जहां हर 1 हर 1 के साथ दोस्त बन सकता है, तो मैं कुछ दोस्त के साथ दोस्त बनना नहीं चाहता क्योंकि उसने मुझे दोस्त के रूप में जोड़ा है? मैंने एम: एन रिश्ते का परीक्षण किया है कि आत्म संदर्भ/द्वि-दिशात्मक सेटअप में भी, जब कुछ 1 मुझे दोस्त के रूप में जोड़ता है, तो मैं उसके साथ मित्र नहीं हूं। ऐसा लगता है कि यह एक सुविधाजनक चीज की तरह है कि मैं यह जान सकता हूं कि दोस्त कौन है? –