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


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

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

Как определить, является ли связь однонаправленной или двунаправленной?

Ценю вашу помощь.

Author: Mr B, 2011-07-12

2 answers

Связь является двунаправленной, если обе сущности содержат ссылку на другую.

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

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

<?php

class Post {
    // ...

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

    // ...
}

class Tag {
    // ...

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

    // ...
}

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

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

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

 27
Author: timdev, 2011-07-12 12:06:44

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

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

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

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

Но очевидно, что существует Множество Отношений

В Блогах Есть Пользователь

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

 1
Author: Vivek, 2015-04-21 05:32:55