cfWheels - создание объектов связанных объектов - PullRequest
3 голосов
/ 08 декабря 2011

У меня есть новая модель myModel, которую я создаю с отношением один-ко-многим для нескольких подмоделей mySubModel, которые создаются одновременно.

при попытке сохранить модель:

<cfset myModel=model("myModel").new(params.mymodel)>
<cfset myModel.save()>

сохраняется только часть модели, элементы внутри params.myModel.mySubModels не создаются. Модели имеют свои настройки отношений, и я могу заставить их извлекать данные в том же формате из myModel с правом включения.

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

Ответы [ 3 ]

3 голосов
/ 09 декабря 2011

Пока главный объект относится к подобъектам с hasMany, Вложенные свойства будут иметь неоценимое значение для вас.

В основной модели:

function init() {
    hasMany("subModels");
    nestedProperties("subModels");
}

Затем выполняется вызов save() в контроллере, который сохраняет родительский объект и все связанные с ним дочерние элементы.

function create() {
    myModel = model("myModel").new(params.myModel);

    // This call to `save()` saves associated children represented in `params.myModel` too
    if (myModel.save()) {
        redirectTo(route="myRoute", success="The model was saved successfully.");
    }
    else {
        flashInsert(error="There was an error saving the model.");
        renderPage(action="new");
    }
}

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

0 голосов
/ 08 декабря 2011

Я бы определил два метода в init модели, например:

validate(methods="validateChildren");
afterCreate(methods="createChildren");

validateChildren будет запускать проверку для каждой дочерней модели (конечно, определенной в соответствующих моделях), рассмотрите возможность использования valid для этой цели - она ​​запускает проверку без сохранения данных.

Используйте следующий синтаксис для передачи ошибки на уровень родительской модели:

addError(property="someproperty", message="Something wrong happened");

Тогда, если ошибок нет, метод 1013 * создаст все необходимые подмодели, используя params для переопределения безопасных значений по умолчанию. Лично я не стал бы использовать циклический переход по параметрам, потому что полагаться на внешние данные не очень хорошая идея, и это может испортить вещи.

0 голосов
/ 08 декабря 2011

Я смотрю на документы здесь: http://cfwheels.org/docs/1-1/chapter/associations, в частности, раздел, связанный с "hasMany ()". Я вижу несколько функций для создания новых дочерних записей на основе родительской записи, но ни одна из них не создаст несколько за один раз. В лучшем случае кажется, что это то, что вы могли бы сделать:

<cfset myModel=model("myModel").create(params.mymodel)>

<cfloop array="#params.mymodel.mySubModels#" index="thisSubModel">
  <cfset myModel.createMySubModel(thisSubModel)>
</cfloop>

Что на самом деле не так уж и плохо.

...