Доктрина 2 Стратегия картирования наследования Нужен совет - PullRequest
0 голосов
/ 29 июня 2011

Я постараюсь объяснить мою проблему. Вскоре у меня есть адресная таблица, таблица комнат, таблица зданий и таблицы пользователей. Таблица адресов должна быть в состоянии сохранить адрес для комнат, зданий и пользователей, конечно же, по их идентификаторам. Поскольку я не могу использовать прямое сопоставление ассоциаций, мне нужно отображение наследования. Позвольте мне прояснить, что я не очень хорош в вопросе отображения наследования. Мое решение состоит в том, чтобы создать таблицу псевдонимов, в которой хранятся идентификаторы комнат, зданий и пользователей (а также имена их классов), и таблица адресов может напрямую взаимодействовать с этой таблицей псевдонимов. Таким образом, в стиле SQL это будет присоединение к псевдониму, и пользователи затем присоединяются к таблице адресов, чтобы найти адрес пользователя. Однако я не мог решить, какой стиль отображения подойдет. Можете ли вы дать мне несколько советов по этому поводу и дать краткое объяснение, почему это так? Спасибо.

1 Ответ

0 голосов
/ 29 июня 2011

Я предлагаю вам использовать отношения какЯ предполагаю, что эта структура (пользователь может иметь собственный адрес, здание имеет адрес, комната имеет здание)

users
 address
  buildings
   rooms

И код для него

/**
 * @orm:Table(name="rooms")
 * @orm:Entity
 */
class Room {
    ....
    /**
     * @orm:InheritanceType("JOINED")
     * @orm:OneToOne(targetEntity="Building")
     * @orm:JoinColumn(name="bid", referencedColumnName="id", onDelete="CASCADE", nullable=false)
     */
    private $building;
    ....
}

/**
 * @orm:Table(name="Buildings")
 * @orm:Entity
 */
class Building {
    ....
    /**
     * @orm:InheritanceType("JOINED")
     * @orm:OneToOne(targetEntity="Address")
     * @orm:JoinColumn(name="aid", referencedColumnName="id", onDelete="CASCADE", nullable=false)
     */
    private $address;
    ....
}

/**
 * @orm:Table(name="rooms")
 * @orm:Entity
 */
class Address {
    ....
    /**
     * @orm:InheritanceType("JOINED")
     * @orm:OneToOne(targetEntity="User")
     * @orm:JoinColumn(name="uid", referencedColumnName="id", onDelete="CASCADE", nullable=false)
     */
    private $user;
    ....
}

/**
 * @orm:Table(name="users")
 * @orm:Entity
 */
class User {
....
}

@orm: необходим при использовании доктрины с Symfony

...