Связь «многие ко многим» с cfwheels без составных ключей

Я следил за информацией отсюда: cfwheels.org/docs/1-1/chapter/nested-properties

В итоге я скачал пример приложения, который ломается в том же месте

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


РЕДАКТИРОВАТЬ

Я узнал проблему ... просто не как ее решить. Там есть маленькая деталь, которую очень легко пропустить. Приложение, кажется, полагается на составные ключи, и порядок ключей имеет значение. Но я не использую составные ключи.

(после https://github.com/mhenke/cfwheels-training/blob/develop/03-tags.md в качестве примера...)

Как заставить работать таблицу с столбцами: id,tagsid и commentsid?

проблема, которую я вижу, заключается в том, что cfwheels продолжает пытаться использовать тег id при создании модели тегов.


person Daniel    schedule 26.11.2011    source источник
comment
просто чтобы уточнить, использование составного ключа заставляет его работать, мне просто любопытно, как заставить его работать без него   -  person Daniel    schedule 27.11.2011


Ответы (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>

Я не проверял это, но это должно работать более или менее. Это не так просто, как могло бы (должно?) быть с помощью помощников на колесах, но вроде не так уж и плохо.

person Jake Feasel    schedule 26.11.2011