Подтвердить что ты не робот

Что такое сторона правды и обратная сторона в примере доктрины 2 doc

На этой странице сопоставления ассоциаций есть пример в разделе manytomany. Но я не понимаю, какой объект (группа или пользователь) является стороной-владельцем.

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

Я тоже добавил код

<?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();
    }

    // ...
}

Я читаю эту аннотацию следующим образом: Пользователь сопоставлен с группами, поэтому группа - это сущность, которая управляет соединением, и, следовательно, владеющая сторона?

Кроме того, я прочитал это в документах:

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 определена в этом объекте.

4b9b3361

Ответ 1

Но я не понимаю, какой объект (группа или пользователь) является стороной-владельцем.

Объект User является владельцем. У вас есть отношение групп в User:

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

Посмотрите выше, $groups var содержит все группы, связанные с этим пользователем, но если вы заметили определение свойства, $groups var имеет то же имя значения mappedBy (mappedBy = "groups" ), как и вы:

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

Что означает mappedBy?

Этот параметр указывает имя свойства в targetEntity, являющемся стороной, обладающей этим отношением.

Ответ 2

Взято из документов:

В взаимно-однозначном отношении объект, содержащий внешний ключ связанный с ним объект в собственной таблице базы данных, всегда является отношение.

В отношении "много-к-одному" многопользовательская сторона по умолчанию является стороной, потому что он содержит внешний ключ. Сторона OneToMany отношения обратный по умолчанию, поскольку внешний ключ сохраняется на стороне Many. Отношение OneToMany может быть только владельцем, если оно выполнено используя отношение ManyToMany с таблицей join и ограничивая одно чтобы разрешить только УНИКАЛЬНЫЕ значения для ограничения базы данных.

Теперь я понимаю, что ManyToMany может несколько путать.

Для ассоциаций "многие-ко-многим" вы можете выбрать, какая сущность является собственностью и какая обратная сторона. Существует очень простое семантическое правило, чтобы решить, какая сторона больше подходит для использования с точки зрения разработчиков. Вам нужно только спросить себя, какая организация несет ответственность за управление подключением и выбирает это как собственную сторону.

Возьмем пример двух объектов Article и Tag. Всякий раз, когда вы хотите связать статью с тегом и наоборот, в основном эта статья несет ответственность за это отношение. Всякий раз, когда вы добавляете новую статью, вы хотите связать ее с существующими или новыми тегами. Форма 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