16

アソシエーションマッピングのこのページでは、manytomanyセクションに例があります。しかし、どちらのエンティティ(グループまたはユーザー)が所有側であるかはわかりません。

http://docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html#many-to-many-bi direction

ここにもコードを入れました

<?php
/** @Entity */
class User
{
    // ...

    /**
     * @ManyToMany(targetEntity="Group", inversedBy="users")
     * @JoinTable(name="users_groups")
     */
    private $groups;

    public function __construct() {
        $this->groups = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}

/** @Entity */
class Group
{
    // ...
    /**
     * @ManyToMany(targetEntity="User", mappedBy="groups")
     */
    private $users;

    public function __construct() {
        $this->users = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}

この注釈を次のように読みますか?ユーザーはmappedByグループであるため、グループは接続管理を行うエンティティであり、所有者側ですか?

また、私はドキュメントでこれを読みました:

For ManyToMany bidirectional relationships either side may be the owning side (the side  that defines the @JoinTable and/or does not make use of the mappedBy attribute, thus using   a default join table).

これにより、JoinTableアノテーションがそのエンティティで定義されているため、Userが所有者になると思います。

4

2 に答える 2

17

しかし、どちらのエンティティ(グループまたはユーザー)が所有側であるかはわかりません

Userエンティティは所有者です。ユーザーにはグループの関係があります。

/**
 * @ManyToMany(targetEntity="Group", inversedBy="users")
 * @JoinTable(name="users_groups")
 */
private $groups;

上記を見ると、$groupsvarにはこのユーザーに関連付けられているすべてのグループが含まれていますが、プロパティの定義に気付いた場合、$groupsvarには次のように同じ値の名前mappedBymappedBy = " groups")があります。

/**
 * @ManyToMany(targetEntity="User", mappedBy="groups")
 */
private $users;

mappedByはどういう意味ですか?

このオプションは、このリレーションの所有側であるtargetEntityのプロパティ名を指定します。

于 2012-11-13T01:07:39.150 に答える
16

ドキュメントから取得:

1対1の関係では、関連するエンティティの外部キーを独自のデータベーステーブルに保持しているエンティティは、常に関係の所有側になります。

多対1の関係では、外部キーを保持するため、デフォルトでは多側が所有側になります。外部キーはMany側に保存されるため、リレーションのOneToMany側はデフォルトで逆になります。OneToManyリレーションは、結合テーブルでManyToManyリレーションを使用して実装され、データベース制約ごとにUNIQUE値のみを許可するように片側を制限する場合にのみ、所有側になります。

今、私は多対多が時々混乱する可能性があることを理解しています。

多対多の関連付けの場合、所有しているエンティティとその逆のエンティティを選択できます。開発者の観点から、どちらの側が所有側に適しているかを決定するための非常に単純なセマンティックルールがあります。接続管理を担当しているエンティティを自問し、それを所有側として選択するだけです。

ArticleとTagの2つのエンティティの例を見てください。アーティクルをタグに接続したい場合、またはその逆の場合は常に、この関係に責任があるのはアーティクルです。新しい記事を追加するときはいつでも、既存または新しいタグと接続する必要があります。createArticleフォームはおそらくこの概念をサポートし、タグを直接指定できるようになります。これが、コードをより理解しやすくするために、記事を所有側として選択する必要がある理由です。

<?php
class Article
{
    private $tags;

    public function addTag(Tag $tag)
    {
        $tag->addArticle($this); // synchronously updating inverse side
        $this->tags[] = $tag;
    }
}

class Tag
{
    private $articles;

    public function addArticle(Article $article)
    {
        $this->articles[] = $article;
    }
}

これにより、関連付けの記事側に追加するタグをグループ化できます。

<?php
$article = new Article();
$article->addTag($tagA);
$article->addTag($tagB);

つまり、要するに、あなたにとってより理にかなっているものは何でも。関係の所有と逆の側面を選択します。:)

ソース:http ://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html

于 2012-11-12T16:01:52.680 に答える