php – 需要帮助理解Doctrine多对多的自引用代码

前端之家收集整理的这篇文章主要介绍了php – 需要帮助理解Doctrine多对多的自引用代码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我无法从 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;

    // ...
}@H_301_2@ 
 

下面是我如何破译一对多的双向关系

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

但如果我使用相同的方法,…下面是我得到的

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

UPDATE

我要澄清我的问题.基本上,我不明白myFriends,friendsWithMe的反面是怎样的.我如何理解这些代码,更重要的是知道如何自己编写这样的关系.

我试着回答我的问题,我仍然很模糊,希望有人能真正给出更好的答案,

所以第1回答问题abt我如何得到$friendsWithMe

基本上,我开始“解码”一个更简单,更常见,多对多的双向关系.

> 1个用户可以在多个组中

> $user->组

> 1组可以有很多用户

> $group->用户

很直接.但这在sql中有什么意义呢?

代码实现

# 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@H_301_2@ 
 

现在到了实际的模型……在sql

代码

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

啊哈!选择作为给定用户的朋友的用户.所以这就是我如何获得$friendsWithMe.然后填补反转的& mappedBy&班上的其他人?

第一眼看下注.

没有那么多深思熟虑,不清楚,2天.我猜

然后作为练习如何从头开始创建多对多的自引用关系?

我打算工作的例子是……嗯,我觉得很蹩脚但是,我会尝试:) … 1位用户/学生可以有很多老师. 1名教师可以有很多用户/学生. 1位用户可以是这里的老师和学生.你知道在这些论坛中,当你回答某些问题时,你就是老师.当你问,你是学生

ERD看起来像

一些代码可供选择,学生的老师,学生的老师

# 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;@H_301_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",*              inverseJoinColumns={@JoinColumn(name="student",referencedColumnName="id")}
     *              )
     */
    private $students;
    /**
     * @ManyToMany(targetEntity="User",mappedBy="students")
     */
    private $teachers;
}@H_301_2@ 
 

它为我生成了这个表

# 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@H_301_2@ 
 

最后我做到了!让我们测试吧……我正在接受

Fatal error: Class ‘Entities\User’ not
found in
D:\ResourceLibrary\Frameworks\Doctrine\tools\sandBox\index.PHP
on line 61

当我尝试做一个

$user = new User;@H_301_2@ 
 

zzz ……

我也在这个问题和我对tumblr的解释上写了博客

猜你在找的PHP相关文章