Обходной путь наследования таблиц классов Doctrine 1.2? - PullRequest
4 голосов
/ 23 марта 2011


Хорошо, во-первых, я знаю, что это невозможно с 1.2., поэтому я ищу обходной путь.
И нет, к сожалению, я не могу использовать Doctrine 2, потому что мой сервер общего хостинга застрял на PHP 5.2.16, и администратор отказывается устанавливать поддержку PHP 5.3.

Итак, вот моя проблема, основная проблема родитель-потомок:
Допустим, у меня есть базовый класс User и дочерние классы Customer, Seller, Admin.

Я искал методы наследования: простой (довольно бесполезный IMO), бетон и агрегация столбцов и даже обходной путь для " поддельное наследование таблицы классов"найдено здесь .

Что мне действительно нужно, так это " наследование таблиц классов ", другими словами User отображается на отдельную таблицу, которая содержит все общие значения, а дочерние таблицы определяют сопоставление с отдельными таблицами, определяя только их конкретные столбцы .

Я отказался от совершенства :) в PHP <5.3, мне действительно все равно, как он будет храниться в БД, но моей объектной модели НУЖНО иметь все функциональные возможности. </p>

Так, что является лучшим выбором для обходного пути?

Это то, что мне нужно.

  • Определение базового класса с общими значениями (имя, имя пользователя, пароль, адрес ...)
  • Дочерние классы со всеми значениями (общими и их специфическими)
  • Дочерние классы должны только видеть их переменные, а не из других дочерних классов (например, у Клиента не должно быть определено workingHours, что является специфическим значением Продавца)
  • Я должен иметь возможность формировать отношения в базовом классе и в отдельных дочерних классах, и эти отношения должны быть привязаны к конкретному классу (например, класс пользователя должен иметь отношение к классу Address, Restourant класс должен иметь отношение к классу Orders, у Restourant также должно быть определено отношение Address ... но у администратора не может быть отношения Orders, потому что он не имеет ничего общего с заказами)

Было бы неплохо запросить базовую таблицу, но, как я понимаю, это одна из самых больших проблем, это не обязательно.

Надеюсь, вы понимаете мой вопрос. Буду признателен за любой совет, потому что я действительно не знаю, что здесь делать.

1 Ответ

3 голосов
/ 23 марта 2011

У меня была та же проблема несколько дней назад, и я выбрал наследование по агрегации столбцов.Базовая концепция не самое чистое или самое красивое решение, которое когда-либо было изобретено, но оно выполняет свою задачу и отвечает всем вашим требованиям, кроме одного:

  • Базовый класс (и таблица) содержит все поля, которые пользовательдочерние классы.
  • Дочерние классы имеют все необходимые поля.
  • Дочерние классы могут получать доступ к полям, принадлежащим полю других chields.
  • Вы можете свободно создавать отношения в своей схеме Doctrine, используя родительские или дочерние классы.

Единственное, что здесь не получается, я выделил жирным шрифтом, но вы можете легко обойти это.Вы можете переопределить методы установки и получения в своих дочерних классах, например, если кто-то пытается получить доступ или изменить поле в объекте Продавца, который принадлежит Клиенту, то вы не разрешаете его (выбрасывать исключение, возвращать false и т. Д.)..).

...