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

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

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

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

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

Оцените справку.

4b9b3361

Ответ 1

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

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

Рассмотрим типичную схему "posts" и "tags". Как правило, вы реализуете двунаправленную связь:

<?php

class Post {
    // ...

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

    // ...
}

class Tag {
    // ...

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

    // ...
}

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

Вы все еще можете ответить на этот вопрос, но вам нужно написать код, чтобы сделать это.

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

Ответ 2

То же, что и ответ timdev,

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

пользователь имеет блоги

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

но, очевидно, существует ManyToOne Связь

Блоги имеет пользователя

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