проблема с вложенными свойствами cfwheels

Я пытаюсь заставить это работать...

У меня есть пять таблиц, которые я пытаюсь связать вместе: properties, languages, propertyLanguages, buildings и buildingTranslations

properties,languages ​​и propertylanguages ​​— типичные отношения «многие ко многим», которые у меня есть. Что я пытаюсь сделать дальше, так это иметь здания, которые связаны с собственностью и имеют текстовые поля для каждого языка, которые будут входить в Buildingtranslations.

Я настроил внешние ключи для propertylanguages, buildings и buildingtranslations

Я просто не знаю, как настроить модель и контроллер при создании/обновлении записей о зданиях.


редактировать

Мне удалось создать представление в mssql, представляющее отношение view

надеюсь, это облегчит понимание отношений.

Я хочу создавать и редактировать Здания с включенными полями перевода (и обновлять их в базе данных)

Языки назначаются на уровне объекта. Здание, связанное с объектом недвижимости с помощью идентификатора свойства, использует доступные языки (через языки свойств[где идентификатор свойства = building.propertyid]) для определения перевода здания, необходимого для здания.


person Daniel    schedule 06.12.2011    source источник
comment
Вы пытаетесь получить все эти данные за один вызов model('').findAll(...) ?   -  person Jake Feasel    schedule 06.12.2011
comment
хорошо findOne(), но не обязательно, просто хочу, чтобы он работал :) Не похоже, что я могу получить его за один вызов, потому что я не могу включить (подключить) объект, но похоже, что оператор SQL довольно далеко выключенный.   -  person Daniel    schedule 06.12.2011
comment
Похоже, на вашей диаграмме отсутствует таблица свойств.   -  person Jake Feasel    schedule 06.12.2011
comment
единственное, что предоставляется, это имя свойства, свойство, используемое другими таблицами, находится в таблице зданий.   -  person Daniel    schedule 06.12.2011
comment
У меня возникли проблемы с пониманием взаимосвязи между зданиями, переводами зданий и языками свойств, особенно той роли, которую языки свойств играют между зданиями и переводами зданий. Не могли бы вы немного подробнее рассказать об этих отношениях?   -  person Jake Feasel    schedule 06.12.2011


Ответы (2)


Надеюсь, это поможет некоторым:

models/Building.cfc

hasMany(name="BuildingTranslations", foreignKey="yrhBuildingId");
belongsTo(name="Property", foreignKey="yrhPropertyId");

controllers/Buildings.cfc

function new () {
  building = model("Building").new();
  building.yrhPropertyId = params.yrhPropertyId; //assuming this was passed in
  requiredLanguages = model("PropertyLanguages").findAll(where="yhrPropertyId=#building.yhrPropertyId#");
}

function create () {
  building = model("Building").new(params.Building);
  building.save();

  requiredLanguages = model("PropertyLanguages").findAll(where="yhrPropertyId=#building.yhrPropertyId#");
  for (var i = 1; i <= requiredLanguages.recordCount; i++)
  {
    buildingTranslation = model("BuildingTranslation").new();
    buildingTranslation.yrhBuildingId = building.id;
    buildingTranslation.yrhLanguageId = requiredLanguages.yrhLanguageId[i];
    buildingTranslation.langName = params.BuildingTranslations[requiredLanguages.yrhLanguageId[i]];
    buildingTranslation.save();
  }

  redirectTo(action="list");
}
person Jake Feasel    schedule 06.12.2011
comment
Кажется, в cfwheels есть сотня примеров, охватывающих отношения «один ко многим» и «многие ко многим», но каждый раз, когда я немного выхожу за рамки этого, я трачу 10 часов на, казалось бы, простую проблему. Я думаю, что буду использовать этот способ управления отношениями в дальнейшем. - person Daniel; 07.12.2011
comment
Меня интересует одна вещь: если во второй части создание не удастся, мне нужно будет удалить здание, верно? - person Daniel; 07.12.2011
comment
Не обязательно; это зависит от вашей ситуации. Например, вы можете обернуть вторую часть в try/catch, и если это не удастся, просто выведите предупреждающее сообщение и перенаправьте их обратно к действию «редактировать» (очевидно, здесь не показано), передав вместе с ним новый идентификатор здания. Вы также можете удалить здание. Что имеет больше смысла в вашем случае. - person Jake Feasel; 07.12.2011

вот подход, который я принял

    <cfset viewBuildingNames = model("yrhBuildingNamesView").findAll(where="yrhBuildingId=#params.key#")>   <!--- FIND ALL BUILDING NAMES --->
    <cfset yrhbuilding = model("Yrhbuilding").findByKey(key=params.key)>   <!--- CREATE BUILDING MODEL --->
    <cfset yrhproperty = model("YrhProperty").findByKey(key=yrhbuilding.yrhPropertyId, include="YrhPropertyLanguages")>   <!--- language info through property--->
    <cfset yrhbuilding.yrhproperty = yrhproperty>
    <cfset yrhbuilding.yrhBuildingTranslations = ArrayNew(1)>

    <cfloop query="viewBuildingNames">
        <cfset yrhBuildingTranslation = model("yrhBuildingTranslation").new(yrhBuildingId=#yrhBuildingId#, yrhLanguageId=#yrhLanguageId#, langName=#LANGNAME#)>
        <cfset ArrayAppend(yrhbuilding.yrhBuildingTranslations, yrhBuildingTranslation)>
    </cfloop>

это своего рода половина пути cfwheels. он опирается на представление, созданное в базе данных

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

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

person Daniel    schedule 06.12.2011
comment
Если логика буквально не соответствует учебнику cfwheels, я обычно обрабатываю операции вставки/обновления/удаления вручную, как вы упомянули. Это просто меньше хлопот. - person Jake Feasel; 07.12.2011