2

私はこれを機能させようとしています...

結合しようとしている 5 つのテーブルがあります: propertieslanguagespropertyLanguagesbuildingsおよびbuildingTranslations

properties,languages と propertylanguages は、私が取り組んでいる典型的な多対多の関係です。私が次にやろうとしているのは、プロパティにリンクされた建物と、建物の翻訳内に入る各言語のテキスト フィールドを持つことです。

propertylanguagesbuildingsおよびの外部キーをセットアップしましたbuildingtranslations

建物の記録を作成/更新するときにモデルとコントローラーをセットアップする方法がわかりません


編集

関係を表す mssql でビューを作成することができました 見る

うまくいけば、これにより関係が見やすくなります。

翻訳フィールドが含まれている (データベースで更新されている) 建物を作成および編集したい

言語はプロパティ レベルで割り当てられます。propertyid を介してプロパティにリンクされている建物は、(propertylanguages[where propertyid = building.propertyid] を介して) 利用可能な言語を使用して、建物に必要な buildingTranslations を決定します。

4

2 に答える 2

2

うまくいけば、これはいくつかの助けになります:

モデル/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");
}
于 2011-12-06T19:46:53.960 に答える
0

これが私がとったアプローチです

    <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 でエラーメッセージが表示されません。エラーだけです。これで問題ありません。

建物の下にアイテムの別のレイヤーを追加することを計画しています。これには、プロパティ言語への同じ接続が必要です。それでも問題なく動作するはずですが、これらのことを処理する cfwheels マジックについてますます不安になっています。複雑な関係を直接処理することに切り替えている可能性があります。

于 2011-12-06T20:02:55.853 に答える