9

このコード ブロックをドクトリン ドキュメントから解読するのに問題があります

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

    // ...
}

以下は、1対多の双方向関係を解読する方法です

代替テキスト
(ソース: tumblr.com )

しかし、同じ方法を使用すると、...以下が得られます

代替テキスト http://img514.imageshack.us/img514/2918/snagprogram0000.png

アップデート

私は私の質問を明確にする必要があります。基本的に、私は、の反対がどのように理解できませmyFriendsfriendsWithMe。どうすればこのコードを理解し、さらに重要なことに、そのような関係を自分でコーディングする方法を知ることができます。

4

2 に答える 2

12

私は私の質問に答えてみます、私はまだこれでかなりぼやけています、誰かが本当により良い答えを与えることができることを願っています、

だから最初に質問に答えるにはどうすればいいですか$friendsWithMe

基本的に、私はより単純で、より一般的な、多対多の双方向の関係を「デコード」することから始めました。

  • 1人のユーザーが多くのグループに参加できます
    • $ user-> groups
  • 1つのグループに多くのユーザーを含めることができます
    • $ group-> users

非常に簡単です。しかし、これは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;

あはは!特定のユーザーの友達であるユーザーを選択します。だからこれは私が得る方法です$friendsWithMeinversedBy次に、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;

わかりました、教義の部分ですか?

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

やっとやった!それをテストしましょう...えーと私は得ています

致命的なエラー:61行目のD:\ ResourceLibrary \ Frameworks \ Doctrine \ tools \ sandbox\index.phpにクラス'Entities\User'が見つかりません

私がやろうとすると

$user = new User;

zzz..。

私はまた、この質問と私のtumblrに関する私の説明についてブログに書いています

于 2010-07-21T10:32:35.087 に答える
4

問題は、M:Nテーブルを持つことです。

  • friend_user_id
  • ユーザーID

ID1と2の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
}
于 2010-07-23T18:55:56.490 に答える