я испытываю затруднения при дешифровке этого блока кода из документации доктрины
/** @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;
// ...
}
ниже то, как я дешифрую один многим двунаправленные отношения
(источник: tumblr.com)
но если я использую тот же метод... ниже то, что я получаю
сопроводительный текст http://img514.imageshack.us/img514/2918/snagprogram0000.png
я shld разъясняю свой вопрос. в основном я не понимаю, как имеет противоположное myFriends
, friendsWithMe
. как я, shld понимают этот код и что еще более важно знают, как кодировать такие отношения сам.
. Я пытаюсь ответить на свой вопрос, я все еще не очень хорошо понимаю это, надеюсь, кто-то действительно может дать лучший ответ,
так что 1-й Чтобы ответить на вопрос о том, как мне получить с $ 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
сейчас в реальной модели ... в 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;
ах-ха! выбирает пользователей, которые являются друзьями данного пользователя . вот как я получаю $ friendsWithMe
. затем заполнить reverseBy
& mappedBy
и остальной класс?
1-й взгляд на нижнюю заметку.
Непонятно без стольких и глубоких размышлений, около 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;
хорошо, доктринальная часть?
/** @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
наконец-то я это сделал! давайте протестируем это ... эээ, я получаю
Неустранимая ошибка: Class 'Entities \ User' not найти в D: \ ResourceLibrary \ Frameworks \ Doctrine \ tools \ sandbox \ index.php в строке 61
, когда я пытаюсь сделать
$user = new User;
zzz ...
, я также написал в блоге об этом вопросе и моем объяснении на моем tumblr
Вопрос в том, есть таблица M: N:
с двумя идентификаторами пользователей 1 и 2. У вас есть только:
friend_user_id = 1 и user_id = 2
или оба
friend_user_id = 1 и user_id = 2 user_id = 2 и friend_user_id = 1
Вы можете реализовать оба способа, в зависимости от того, как вы кодируете управление коллекцией на стороне-владельце.
Случай A:
public function addFriend(User $friend)
{
$this->myFriends[] = $friend;
}
Случай B:
public function addFriend(User $friend)
{
$this->myFriends[] = $friend;
$friend->myFriends[] = $this; // php allows to access private members of objects of the same type
}