Нуждаюсь в помощи понимая Доктрину многие многим сам ссылающийся на код

я испытываю затруднения при дешифровке этого блока кода из документации доктрины

/** @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)

но если я использую тот же метод... ниже то, что я получаю

сопроводительный текст http://img514.imageshack.us/img514/2918/snagprogram0000.png

ОБНОВЛЕНИЕ

я shld разъясняю свой вопрос. в основном я не понимаю, как имеет противоположное myFriends, friendsWithMe. как я, shld понимают этот код и что еще более важно знают, как кодировать такие отношения сам.

8
задан Glorfindel 3 August 2019 в 03:08
поделиться

2 ответа

. Я пытаюсь ответить на свой вопрос, я все еще не очень хорошо понимаю это, надеюсь, кто-то действительно может дать лучший ответ,

так что 1-й Чтобы ответить на вопрос о том, как мне получить с $ friendsWithMe

, я начал с «декодирования» более простого, более распространенного двунаправленного отношения «многие ко многим».

  • 1 пользователь может быть во многих группах
    • $ user-> groups
  • В 1 группе может быть много пользователей
    • $ group-> users

очень прямолинейны. но как это имеет смысл в 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;

ах-ха! выбирает пользователей, которые являются друзьями данного пользователя . вот как я получаю $ friendsWithMe . затем заполнить reverseBy & mappedBy и остальной класс?

1-й взгляд на нижнюю заметку.

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

наконец-то я это сделал! давайте протестируем это ... эээ, я получаю

Неустранимая ошибка: Class 'Entities \ User' not найти в D: \ ResourceLibrary \ Frameworks \ Doctrine \ tools \ sandbox \ index.php в строке 61

, когда я пытаюсь сделать

$user = new User;

zzz ...

, я также написал в блоге об этом вопросе и моем объяснении на моем tumblr

11
ответ дан 5 December 2019 в 11:22
поделиться

Вопрос в том, есть таблица M: N:

  • friend_user_id
  • user_id

с двумя идентификаторами пользователей 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
}
4
ответ дан 5 December 2019 в 11:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: