gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:30:35 24 4
gpt4 key购买 nike

我无法破译来自 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
(来源:tumblr.com)

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

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

更新

我应该澄清我的问题。基本上,我不明白 myFriendsfriendsWithMe 的反义词是什么。我应该如何理解这段代码,更重要的是知道如何自己编写此类关系。

最佳答案

我尝试回答我的问题,我对此仍然很模糊,希望有人能给出更好的答案,

所以第一个回答关于我如何使用 $friendsWithMe

推导的问题

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

  • 1个用户可以在多个组中
    • $用户->群组
  • 1组可以有很多用户
    • $组->用户

非常直接。但这在 SQL 中有什么意义呢?

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

现在是实际模型......在 SQL 中

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;

啊哈! 选择作为给定用户 friend 的用户。这就是我获取 $friendsWithMe 的方式。然后填充 inversedBymappedBy 以及类的其余部分?

首先看下注。

alt text

没有这么多深入的思考就不清楚了,大约 2 天。我猜

那么作为练习,我如何从头开始创建多对多自引用关系?

我要处理的示例是...嗯,我觉得很糟糕,但是,我会尝试 :) ...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 ...

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

关于php - 需要帮助理解 Doctrine 多对多自引用代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3290319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com