вопрос вложенных свойств cfwheels - PullRequest
2 голосов
/ 06 декабря 2011

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

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

свойства, языки и языки собственности - это типичные отношения «многие ко многим», с которыми я работаю. Далее я пытаюсь создать здания, которые связаны с собственностью и имеюттекстовые поля для каждого языка, который будет входить в переводы здания.

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

Я просто не уверенкак настроить модель и контроллер при создании / обновлении записей зданий


edit

Мне удалось создать представление в mssql, которое представляет отношение view http://img33.imageshack.us/img33/7411/11907303.png

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

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

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

Ответы [ 2 ]

2 голосов
/ 06 декабря 2011

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

Модели / Building.cfc

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

Контроллеры / 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");
}
0 голосов
/ 07 декабря 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>

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

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

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

...