Как определить, является ли табличное отношение двунаправленным или однонаправленным в Doctrine 2? - PullRequest
20 голосов
/ 12 июля 2011

Я нахожусь в процессе обновления Doctrine 1.1.4 до Doctrine 2.0.6 в моем приложении Zend.

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

Как определить, является ли отношение однонаправленным или двунаправленным?

Оцените помощь.

Ответы [ 2 ]

30 голосов
/ 12 июля 2011

Отношение является двунаправленным, если обе сущности содержат ссылку на другую.

Если вы пропустите одну из этих ссылок, она является однонаправленной.

Рассмотрим типичные "сообщения" и "теги"схемы.Как правило, вы реализуете двунаправленную ассоциацию:

<?php

class Post {
    // ...

    /** 
     * @ManyToMany(targetEntity="Tag",inversedBy="posts")
     */
     protected $tags;

    // ...
}

class Tag {
    // ...

    /**
     * @ManyToMany(targetEntity="Post",mappedBy="tags")
     */
     protected $posts

    // ...
}

Теперь представьте, что вы решили, что вам никогда (или редко) не нужно было отвечать на вопросы типа «Какие сообщения имеют тег« foo »?».Вы можете опустить ассоциацию $ posts в вашей сущности Tag, преобразовав ее в однонаправленную ассоциацию, и снять нагрузку с ORM.

Вы все равно можете ответить на этот вопрос, но вам придется написатькод для этого.

На самом деле, это, вероятно, хороший способ пойти в сценарии «Посты / теги», так как вы обычно не добавляете / удаляете посты из тегов.Обычно вы добавляете / удаляете теги только из сообщений.Вы можете переходить от тегов к сообщениям только при поиске «всех сообщений с тегом« x »», которые могут быть тривиально реализованы в каком-то классе обслуживания.

1 голос
/ 21 апреля 2015

То же, что и ответ Тимдева,

Однонаправленный и двунаправленный - это просто концепции ORM, они не имеют ничего общего с базой данных. Предположим, у вас есть отношение OneToMany -

у пользователя естьблоги

Таким образом, вы можете добавить это в свою учетную запись пользователя как OneToMany Свойство

, но, очевидно, существует ManyToOne Отношение

В блогах есть пользователь

, поэтому необязательно создавать отношение ManyToOne в вашей сущности блога. Если вы хотите получить доступ к пользователю из сущности блога, добавьте это свойство, если не хотитетогда не добавляйте, это не обязательно. в обоих случаях (вы добавляете двунаправленную ссылку или нет) ORM будет поддерживать ту же структуру базы данных (таблица блога будет иметь столбец user_id).

...