2011-12-08 4 views
3

나는 동시에 생성되는 하위 모델 mySubModel의 무리에 대해 일대 다 관계로 생성하는 새 모델 myModel을 보유하고 있습니다. 나는 모델을 저장하려고하면cfWheels - 객체 관련 객체 만들기

은 :

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

전용 모델 부분이 저장됩니다를 params.myModel.mySubModels 내부의 항목이 생성되지 않습니다. 모델에 관계 설정이되어 있고 오른쪽에 같은 형식의 데이터를 가져올 수 있습니다. myModel.

각 모델을 따로 저장할 수는 있지만 문제를 일으키거나 cfwheels에서이 문제를 이미 처리 할 수 ​​있다면 코드 바늘을 만드는 것이 걱정됩니다. 초기 모델을 저장 한 다음 추가 하위 모델을 저장해야하고 오류가있는 경우 이미 데이터베이스에 작성된 모델 및 기타 하위 모델을 삭제해야합니다.

+0

하위 모델은 어떻게 연결됩니까? 'hasOne' 또는'belongsTo' 또는 둘 다? –

+0

'model hasMany (submodels)'과'sub-model belongsTo (model) ' – Daniel

답변

3

주 개체가 hasMany 인 하위 개체와 관련된 한 Nested Properties은 매우 중요합니다. 주요 모델에서

:

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

Chris에게 많은 감사를드립니다. 모델 내부에서 nestedProperty를 놓쳤습니다. – Daniel

+0

예 Chris에게 감사드립니다. 저는 잠시 동안 바퀴를 사용했지만 그 기능을 실제로 알지 못했습니다. 알아 둘만한. –

+0

하위 모델 유효성 검사 오류에 대해 플래시 메시지를 가져와 표시하는 방법은 여전히 ​​좋지만 여전히 명확하지 않습니다. 말하자면,'errorMessagesFor'를 사용할 수 있습니까? – Sergii

0

여기에서 문서를보고 있는데, 구체적으로는 "hasMany()"와 관련된 섹션이 http://cfwheels.org/docs/1-1/chapter/associations입니다. 부모 레코드를 기반으로 새 하위 레코드를 만드는 몇 가지 기능이 있지만 한 번에 여러 항목을 만들지는 않습니다. 기껏해야 다음과 같이 할 수 있습니다.

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

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

정말 나쁘지 않습니다.

0

이 같은 모델의 init의 두 가지 방법을 정의합니다 :

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

validateChildren는, (물론, 모델 대응에 정의 된) 각 하위 모델에 대한 검증을 실행이 목적을 위해 valid을 사용하는 것이 좋습니다 것입니다 - 데이터를 저장하지 않고 유효성 검사를 시작합니다. 이 같은

사용 구문은 상위 모델 수준에 오류를 통과 :

안전 기본값을 대체 할 params를 사용 createChildren 방법은 필요한 모든 하위 모델을 만들 것입니다 오류가있을 수없는 그런 경우
addError(property="someproperty", message="Something wrong happened"); 

. 개인적으로 외부 데이터에 의존하는 것이 그리 좋은 아이디어는 아니며 물건을 엉망으로 만들 수 있기 때문에 params를 반복적으로 사용하지 않을 것입니다.

+0

나는이 답변이 왜 downvoted인지 이해한다 : 프레임 워크 객체 모델의 힘을 적절히 사용하지는 않지만 적어도 모든 하위 모델을 가져올 수있다. 경고를 쉽게. – Sergii