2010-07-20 44 views
7

tôi đang gặp khó khăn giải mã khối mã này từ doctrine documentationCần giúp đỡ để hiểu học thuyết nhiều để nhiều mã tự tham khảo

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

    // ... 
} 

dưới đây là làm thế nào tôi giải mã một đến nhiều mối quan hệ hai chiều

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

nhưng nếu tôi sử dụng cùng một phương pháp, ... dưới đây là những gì tôi nhận được

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

CẬP NHẬT

tôi sẽ làm rõ câu hỏi của mình. về cơ bản, tôi không hiểu làm thế nào là đối diện của myFriends, friendsWithMe. làm thế nào tôi shld làm cho tinh thần của mã này và quan trọng hơn là biết làm thế nào để mã các mối quan hệ như vậy bản thân mình.

Trả lời

10

tôi đưa ra một thử lúc trả lời câu hỏi của tôi, tôi vẫn còn khá mờ với điều này, hy vọng ai đó thực sự có thể cung cấp một câu trả lời tốt hơn,

nên 1 trả lời câu hỏi abt làm thế nào để lấy được với $friendsWithMe

về cơ bản, tôi bắt đầu với "giải mã" một mối quan hệ hai chiều, đơn giản hơn, phổ biến hơn.

  • 1 người sử dụng có thể ở nhiều nhóm
    • $ user-> nhóm
  • 1 nhóm có thể có nhiều người sử dụng
    • $ và nhóm> người dùng

rất thẳng về phía trước. nhưng điều này có ý nghĩa như thế nào trong SQL?

alt text

mã để thực hiện

# 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 

nay đến mô hình thực tế ... trong SQL

alt text

trong mã

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

ah ha! chọn người dùng là bạn của người dùng đã cho. vì vậy đây là cách tôi nhận được $friendsWithMe. sau đó điền vào inversedBy & mappedBy & phần còn lại của lớp học?

Cái nhìn đầu tiên ở ghi chú dưới cùng.

alt text

không rõ ràng mà không cần quá nhiều và suy nghĩ sâu sắc, abt 2 ngày. tôi đoán

sau đó làm cách thực hành làm cách nào để tạo nhiều mối quan hệ tự tham chiếu từ đầu?

ví dụ tôi sẽ làm việc là ... hmm, khá crappy tôi nghĩ nhưng, tôi sẽ thử :) ... 1 người dùng/sinh viên có thể có nhiều giáo viên. 1 giáo viên có thể có nhiều người dùng/sinh viên. 1 người dùng có thể là giáo viên và sinh viên tại đây. u biết như trong các diễn đàn như thế này, khi bạn trả lời một số câu hỏi, bạn là giáo viên. khi u hỏi, u là một sinh viên

ERD sẽ trông giống như

alt text

một số mã để lựa chọn, học sinh của giáo viên, giáo viên sinh viên

# 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, phần thuyết ?

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

mà tạo ra bảng này cho tôi

# 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 

cuối cùng tôi thực hiện nó! cho phép kiểm tra nó ... erm tôi đang nhận được

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

khi tôi cố gắng để làm một zzz

$user = new User; 

...

tôi cũng đã viết blog abt câu hỏi này và Giải thích của tôi trên của tôi tumblr

+0

$ user = new User(); – ruipacheco

+0

+1 Để hiểu rõ câu hỏi và nỗ lực trong việc chuẩn bị tài liệu nguồn bổ sung – calumbrodie

+1

Xin chào. Tôi có vấn đề với học thuyết với quan hệ này. Khi tôi thêm các mục vào loại bộ sưu tập đó, hãy xóa và sau đó loại bỏ tất cả chúng và tuôn ra một lần nữa, tôi nhận được 'Lớp 'Doctrine \ ORM \ Persisters \ ManyToManyPersister' không được tìm thấy trong chuỗi cấu hình không gian tên'. Khi tôi xóa các mục, nhưng hãy để ít nhất một thứ hoạt động hoàn hảo. Bạn có thể kiểm tra hành vi này cho tôi không? và nếu bạn không nhận được bất kỳ vấn đề nào về phiên bản của học thuyết bạn đang sử dụng? Tôi sẽ biết ơn. –

3

câu hỏi đặt ra là, có M: N bảng:

  • friend_user_id
  • user_id

với hai người dùng id 1 và 2. Bạn chỉ có:

friend_user_id = 1 và user_id = 2

hoặc cả hai

friend_user_id = 1 và user_id = 2 user_id = 2 và friend_user_id = 1

Bạn có thể thực hiện cả hai cách, tùy thuộc vào cách bạn mã quản lý bộ sưu tập của bên sở hữu.

Trường hợp A:

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

Trường hợp 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

cũng liên quan đến vấn đề Người dùng mới của bạn, bạn phải hiểu cách hoạt động của các công cụ lập trình PHP 5.3, trước tiên bạn phải thiết lập trình nạp tự động cho không gian tên "Thực thể", sau đó bạn cũng phải gọi "sử dụng thực thể \ Người dùng;" để có thể thực hiện "Người dùng mới" thay vì "new \ Entities \ User;" – beberlei

+1

liên quan đến lỗi người dùng của tôi, nó chỉ ra tôi đã không đặt một 'không gian tên thực thể' trên đầu trang của lớp học của tôi –

+0

vì vậy tôi có thể nói rằng trường hợp 1 là một mối quan hệ uni-directional và 2 một bi? tôi nghĩ rằng nếu tôi là một người sử dụng của một mạng xã hội, nơi every1 có thể được bạn bè với every1, tôi sẽ không muốn làm bạn với some1 chỉ vì anh ta thêm tôi như một người bạn? tôi đã thử nghiệm mối quan hệ M: N thậm chí trong thiết lập tự tham khảo/hai chiều, khi some1 thêm tôi làm bạn, tôi không phải là bạn của anh ấy. nó có vẻ giống như một điều thuận tiện hơn mà tôi có thể tìm ra ai là friendWithMe? –

Các vấn đề liên quan