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>