Jie*_*eng 8 php orm doctrine doctrine-orm
我无法从教条文档中解密这段代码
/** @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;
// ...
}
Run Code Online (Sandbox Code Playgroud)
下面是我如何破译一对多的双向关系
alt text http://29.media.tumblr.com/tumblr_l5uwg3VH171qbp1vqo1_r1_500.png
但如果我使用相同的方法,...下面是我得到的
替代文字http://img514.imageshack.us/img514/2918/snagprogram0000.png
我要澄清我的问题.基本上,我不明白是怎么相反myFriends,friendsWithMe.我如何理解这些代码,更重要的是知道如何自己编写这样的关系.
Jie*_*eng 11
我试着回答我的问题,我仍然很模糊,希望有人能真正给出更好的答案,
所以第一个回答问题abt我如何得出 $friendsWithMe
基本上,我开始"解码"一个更简单,更常见,多对多的双向关系.
很直接.但这在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
Run Code Online (Sandbox Code Playgroud)
现在到实际模型......在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;
Run Code Online (Sandbox Code Playgroud)
啊哈!选择作为给定用户的朋友的用户.所以这就是我得到的$friendsWithMe.然后填补inversedBy&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;
Run Code Online (Sandbox Code Playgroud)
好的,学说部分?
/** @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;
}
Run Code Online (Sandbox Code Playgroud)
它为我生成了这个表
# 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
Run Code Online (Sandbox Code Playgroud)
最后我做到了!让我们测试吧...我正在接受
致命错误:第61行的D:\ ResourceLibrary\Frameworks\Doctrine\tools\sandbox\index.php中找不到"实体\用户"类
当我尝试做一个
$user = new User;
Run Code Online (Sandbox Code Playgroud)
zzz ......
我也在博客上写了这个问题和我对tumblr的解释