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

17

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

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

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

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

    
задан Sid 12.07.2011 в 12:33
источник

2 ответа

27

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

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

Рассмотрим типичную схему «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, поскольку вы обычно не добавляете / не удаляете Posts from Tags. Как правило, вы добавляете / удаляете теги только из сообщений. Вы всегда будете переходить от тегов к сообщениям при поиске «всех сообщений с тегом« x », которые могут быть тривиально реализованы в каком-либо классе обслуживания.

    
ответ дан timdev 12.07.2011 в 14:06
источник
  • Спасибо, это имеет смысл. –  Sid 12.07.2011 в 16:21
  • WOW, простое объяснение, но достаточно ясное, чтобы мы поняли концепцию. –  GusDeCooL 18.08.2014 в 17:29
1

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

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

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

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

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

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

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

    
ответ дан Vivek 21.04.2015 в 07:32
источник