Coldfusion cfwheels嵌套属性问题

Coldfusion cfwheels嵌套属性问题,coldfusion,coldfusion-9,cfwheels,Coldfusion,Coldfusion 9,Cfwheels,我正试着让它工作 我尝试将五个表绑定在一起:属性、语言、属性语言、建筑和建筑翻译 属性、语言和属性语言是一种典型的多对多关系,我正在工作。我下一步要做的是让建筑链接到属性,并在建筑翻译中包含每种语言的文本字段 我已经为属性语言、建筑和建筑翻译设置了外键 我只是不知道在创建/更新建筑记录时如何设置模型和控制器 编辑 我已经设法在mssql中创建了一个表示关系的视图 希望这能让我们更容易看到这些关系 我想创建和编辑包含翻译字段的建筑物(并在数据库中更新) 在属性级别分配语言。通过property

我正试着让它工作

我尝试将五个表绑定在一起:
属性
语言
属性语言
建筑
建筑翻译

属性、语言和属性语言是一种典型的多对多关系,我正在工作。我下一步要做的是让建筑链接到属性,并在建筑翻译中包含每种语言的文本字段

我已经为
属性语言
建筑
建筑翻译设置了外键

我只是不知道在创建/更新建筑记录时如何设置模型和控制器


编辑

我已经设法在mssql中创建了一个表示关系的视图

希望这能让我们更容易看到这些关系

我想创建和编辑包含翻译字段的建筑物(并在数据库中更新)


在属性级别分配语言。通过propertyid链接到属性的建筑使用可用语言(通过propertylanguages[其中propertyid=building.propertyid])来确定建筑所需的建筑转换

模型/建筑.cfc

控制器/建筑物.cfc

函数新建(){
建筑=模型(“建筑”)。新建();
building.yrhPropertyId=params.yrhPropertyId;//假设传入了该参数
requiredLanguages=model(“PropertyLanguages”).findAll(其中=“yhrPropertyId=#building.yhrPropertyId#”);
}
函数创建(){
建筑=模型(“建筑”)。新建(参数建筑);
building.save();
requiredLanguages=model(“PropertyLanguages”).findAll(其中=“yhrPropertyId=#building.yhrPropertyId#”);

对于(var i=1;i,这里是我采取的方法

    <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>

这有点半途而废。它依赖于在数据库中创建的视图

一旦创建了mode;,更新就可以了,但是我没有收到关于空langNames的错误消息,只是一个错误,我可以接受


我正计划在大楼下添加另一层物品,这将需要与propertyLanguages保持相同的连接,但它仍能正常工作。我对cfwheels魔法处理这些东西越来越不放心。我可能会直接切换到处理复杂的关系。

你想找一个一次调用model(“”)。findAll(…)?很好的findOne(),但不一定,只是想让它工作:)我似乎无法在一次调用中获得它,因为我无法在对象上包含(subinclude),但看起来SQL语句非常遥远。看起来您的图表缺少“属性”"表。其中一个表提供的唯一内容是属性名称,其他表使用的属性ID在buildings表中。我很难理解建筑物、buildingtranslations和PropertyLanguages之间的关系,特别是PropertyLanguages在建筑物和BuildingTranslation之间所起的作用。你能详细说明一下吗这种关系有一点吗?似乎cfwheels有100个例子,涵盖了一对多和多对多的关系,但只要我稍微离开它一点,我就会在一个看似简单的问题上花费10个小时。我想我会用这种方式来处理关系。我想知道的一件事是,如果创建失败了在第二部分中,我需要删除该建筑,对吗?不一定;这取决于您的情况。例如,您可以将第二部分包装在一个try/catch中,如果失败,只需闪现一条警告消息并将其重定向回“编辑”操作(此处显然未显示),同时传递新的buildingid。您也可以删除该建筑。在您的情况下,任何更有意义的操作都可以。除非逻辑是“cfwheels教科书”中直接给出的,否则我倾向于“手动”处理插入/更新/删除操作,正如您所提到的。这只会减少麻烦。
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");
}
    <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>