Отношение «многие ко многим» с колесами без составных ключей - PullRequest
1 голос
/ 26 ноября 2011

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

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

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


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

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

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

Как получить таблицу с cols: id, tagsid и commentsid для работы?

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

1 Ответ

1 голос
/ 27 ноября 2011

Как бы я ни любил в 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>

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

...