Одно представление для двух моделей: использовать класс базовой модели, чтобы упростить задачу?

У меня такой сценарий:

  • Сайт для управления отелями.
  • В ходе проекта был добавлен еще один тип модели отеля, так что теперь их два.
  • Теперь босс хочет, чтобы список отелей включал оба типа отелей.

Я думал о следующих возможных решениях:

  1. Придумайте суперкласс, содержащий общие свойства, необходимые для отображения в списке отелей, и переопределите их соответствующим образом.
  2. Взломайте мой путь в представлении. Теперь у него есть один цикл, по пути создающий HTML-код (очевидно). Если это сработает, будет две петли.

Проблема, которую я вижу с подходом № 1, заключается в следующем: «Hotel1 расширяет BaseHotel1», «Hotel2 расширяет BaseHotel2». Итак, я создам суперкласс, и что дальше?

Проблема с подходом № 2 заключается в следующем: я все еще далек от «профессионального» разработчика Symfony, и я не уверен, что рассматриваемое представление вообще будет иметь доступ к более чем одному методу модели. Может быть, сработают частичные рендеры из другого модуля?

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

Если это так, пожалуйста, поделитесь своими мыслями. Спасибо!


person dimitarvp    schedule 09.05.2011    source источник
comment
Насколько похожи две модели отелей? Содержат ли они много перекрывающихся полей?   -  person richsage    schedule 09.05.2011
comment
Они делают. У них есть 8 похожих свойств — только с разными именами столбцов в БД. Вторая модель Hotel имеет еще несколько свойств, но они, к счастью, не имеют отношения к действиям по перечислению отелей. На данный момент у меня есть полный контроль над проектом, и я, вероятно, могу объединить таблицы/модели. Хотя интересны другие варианты.   -  person dimitarvp    schedule 09.05.2011


Ответы (2)


Я знаю, что вы отметили свой вопрос тегом Propel, но я бы рассмотрел возможность использования наследование доктрины здесь - если есть эквивалент Propel, то есть либо "конкретное", либо "агрегирование столбцов" (в зависимости от того, как вы хотите хранить свои данные). По сути, вы получите базовый класс Hotel, из которого затем вы получите, например, классы Hotel1 и Hotel2.

Таким образом, у вас могут быть методы, общие для обеих моделей, в классах модели и таблицы Hotel, а затем специфические для отеля методы в классах Hotel1 и Hotel2.

Изменить: Только что нашел эквивалент Propel, хотя эта ссылка для Пропеля 1.5. Однако похоже, что Propel 1.3 поддерживает только «простой» тип наследования.

person richsage    schedule 09.05.2011
comment
Похоже, мне нужно объединить две таблицы БД. - person dimitarvp; 09.05.2011
comment
Да, это правильно. Делая это, вы по-прежнему можете сохранять свои расширенные поля для Hotel2, но также иметь методы, которые работают в обоих классах, а также возможность легко отображать все отели в одном списке (и впоследствии фильтровать по Hotel1 или Hotel2 и т. д.). - person richsage; 09.05.2011
comment
Итак, давайте будем точными: я создаю сценарий SQL для создания одной таблицы большего размера (или заставляю Propel сгенерировать ее для меня), я выполняю шаги, указанные в этом URL-адресе, затем я разрабатываю 2 сценария для переноса данных из исходных 2 таблиц в новую таблицу, затем запустите ее, и она работает? ;) - person dimitarvp; 09.05.2011
comment
Предполагая, что ваши пальцы тоже скрещены, это звучит надежно ;-) хех, я бы сначала создал таблицу в Propel - таким образом у вас будет связанный с ней PHP, а также определенные имена столбцов для работы. Но так и должно быть... :-) - person richsage; 09.05.2011
comment
Хорошо, не могли бы вы дать мне URL-адрес, указывающий, как сделать то же самое с помощью файла schema.yml? Я бы очень хотел работать с YAML для конфигураций, а не с XML. - person dimitarvp; 09.05.2011
comment
Я также думаю, не следует ли мне просто добавить поля Hotel2 в Hotel1 по одной простой причине: я не хочу кодировать новый контроллер и представления для нового омни-отеля. Какие подводные камни мне следует ожидать, если я это сделаю? - person dimitarvp; 09.05.2011
comment
Если вы собираетесь объединить оба набора данных, вы можете отказаться от наследования и просто использовать поля Hotel2 в качестве необязательных элементов для записей Hotel1. И вы получите таблицу «Отель», возможно, с индикаторным флажком. Может быть, наследование здесь слишком усложняет дело :-) - person richsage; 09.05.2011
comment
Когда я думаю об этом, это кажется лучшим решением. Это избавило бы меня от необходимости создавать новый контроллер/представление. Таким образом, я могу просто пойти и отредактировать существующий код C/V и почти сразу начать экспериментировать. Правильно. Ныряю по носу, и как только у меня получится, я отмечу ответ! - person dimitarvp; 09.05.2011
comment
Хорошо, работа сделана. Объединил все свойства Hotel2 в схему Hotel1, переместил некоторый код из контроллера Hotel2 в контроллер Hotel1, сделал несколько небольших настроек, и все в порядке. Большое спасибо за помощь! Отметив это как ответ. - person dimitarvp; 10.05.2011
comment
Отличный материал - рад, что все прошло хорошо! :-) - person richsage; 10.05.2011

Доктрина предлагает хорошее решение здесь. Взгляните на наследование объединения столбцов. Возможно, Propel предоставляет что-то подобное, но я не знаком с propel…

person Flask    schedule 09.05.2011