У меня возникли проблемы с расшифровкой этого блока кода из документации доктрины
/** @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 http://img.ruphp.com/doctrine/tumblr_l5uwg3VH171qbp1vqo1_r1_500.png
но если я использую тот же метод, … ниже – то, что я получаю
alt text http://img514.imageshack.us/img514/2918/snagprogram0000.png
Я разъясню свой вопрос. В принципе, я не понимаю, как противоположность myFriends
, friendsWithMe
. как я понимаю смысл этого кода и, что более важно, знаю, как правильно кодировать такие отношения.
я пытаюсь ответить на мой вопрос, я все еще довольно размываюсь с этим, надеюсь, что кто-то действительно сможет дать лучший ответ,
так что 1, чтобы ответить на вопрос 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
теперь к реальной модели … в 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
. затем, чтобы заполнить inversedBy
& 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
наконец я это сделал! давайте протестируем его … erm я получаю
Неустранимая ошибка: «Объекты \ Пользователь» класса не найдены в 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 }