与没有复合键的cfwheels的多对多关系

时间:2011-11-26 02:20:17

标签: coldfusion many-to-many cfwheels

我一直在关注这里的信息: cfwheels.org/docs/1-1/chapter/nested-properties

我最终下载的sample application在同一个地方发生了分析

代码执行正常,从某种意义上说我没有错误,但是许多表没有获得新条目,当我在数据库中手动添加条目时,它们不会被复选框反映出来,有时它们会被反映出来在更新模型时删除。


修改

我发现了问题...而不是如何解决它。那里有一个很容易错过的小细节。该应用程序似乎依赖于复合键,并且键的顺序很重要。但我没有使用复合键。

(以https://github.com/mhenke/cfwheels-training/blob/develop/03-tags.md为例......)

如何获得包含cols的表:idtagsidcommentsid

我看到的问题是cfwheels在创建标记模型时不断尝试使用id标记

1 个答案:

答案 0 :(得分:1)

尽管我喜欢CFWheels,但我不得不承认我不喜欢表单助手功能或“快捷方式”功能。在这个示例中,我只是“恢复”到更直接/简单的CFML来构造复选框(如果不是整个表单)和循环逻辑以将值保存在连接表中。例如:

<fieldset>
<legend>PropertyLanguages</legend>

<cfloop query="Languages">
<label>
  #Languages.language#
  <input type="checkbox" name="Property[PropertyLanguages]" value="#Languages.id#">
</label>
</cfloop>


</fieldset>

然后更改更新控制器逻辑:

<!--- CONTROLLER - update.cfm - updateProperty --->
<cffunction name="updateProperty">
    <cfscript>   
    Property = model("Property").findByKey(key=params.Property.id);
    Property.update(params.Property);

    if (IsDefined("params.Property.PropertyLanguages"))
    {
      model("PropertyLanguages").deleteAll(where="propertyid=#params.Property.id# AND languageid NOT IN (#params.Property.PropertyLanguages#)");

      for (var i = 1; i<=ListLen(params.Property.PropertyLanguages); i++)
      {
        languageid = ListGetAt(params.Property.PropertyLanguages, i);
        if (! IsObject(model("PropertyLanguages").findOne(where="propertyid=#params.Property.id# AND languageid=#languageid#")))
        {
          pl = model("PropertyLanguages").new();
          pl.langugageid = languageid;
          pl.propertyid = params.Property.id;
          pl.save();
        }
      }
    }
    else
    {
      model("PropertyLanguages").deleteAll(where="propertyid=#params.Property.id#");
    }
    </cfscript>    
</cffunction>

我没有对此进行测试,但它应该或多或少地起作用。它不是那么简单(应该?)使用轮子助手,但它似乎并不太糟糕。