2009-09-03 2 views
0

itemslocations 두 테이블 사이에 HABTM 관계가 있으며 테이블에 items_locations을 사용하여 연결합니다.CakePHP 즉시 여러 레코드 편집

items_locations도 조금 더 많은 정보를 저장합니다.

Location: Factory XYZ 
___________________________ 
|___Item____|___Quantity___| 
| Widget |   3 | 
| Sprocket |   1 | 
| Doohickey |   15 | 
---------------------------- 

: 여기 한 번에 여러 필드를 한 위치에있는 모든 항목을 표시하고, 데이터 그리드 스타일의 인터페이스를 통해 사용자를 할 수있는 페이지를 만들 편집하기 위해 노력하고있어

items_locations(id, location_id, item_id, quantity) 

스키마입니다

var $uses = array('Item', 'Location'); // should I add 'ItemsLocation' ? 

가 어떻게이 데이터를 편집 할 수있는 다차원 양식을 구축 할이 돕기 위해, 나는이 InventoryController라는 컨트롤러가?


편집 :

내 데이터 Deceze는 아래에 설명하는 방법처럼 보이도록 얻으려고하지만 난 다시 문제가 발생 ...

// inventory_controller.php 
function edit($locationId) { 

    $this->data = $this->Item->ItemsLocation->find(
     'all', 
     array(
      "conditions" => array("location_id" => $locationId) 
     ) 
    ); 

내가 그렇게 , $this->data는 다음과 같이 나온다 :

Array (
    [0] => Array (
     [ItemsLocation] => Array (
      [id] => 16 
      [location_id] => 1 
      [item_id] => 1 
      [quantity] => 5 
     ) 
    ) 
    [1] => Array (
     [ItemsLocation] => Array (/* .. etc .. */) 
    ) 
) 

답변

6

당신이,918,982,873에서 데이터를 편집하지 않을 경우모델의 경우 조인 모델에서만 작업하는 것이 가장 좋습니다. 따라서, 양식은 다음과 같이 보일 것이다 각 항목의 수량을 편집 :

echo $form->create('ItemsLocation'); 

// foreach Item at Location: 

echo $form->input('ItemsLocation.0.id'); // automatically hidden 
echo $form->input('ItemsLocation.0.quantity'); 

각 레코드에 대한 카운터 (.0., .1., ...)를 증가

. 당신이 당신의 컨트롤러에서 수신해야 $this->data 다음과 같이한다 : 당신은 단순히 다른 모델의 기록처럼이 저장할 수 있습니다

array(
    'ItemsLocation' => array(
     0 => array(
      'id' => 1, 
      'quantity' => 42 
     ), 
     1 => array(
      ... 

: $this->Item->ItemsLocation->saveAll($this->data). 위치에 항목을 추가하는 데 큰 차이가 없으므로 id을 생략하고 사용자가 item_id을 선택하게하십시오.

array(
    'location_id' => 42, // prepopulated by hidden field 
    'item_id' => 1  // user selected 
    'quantity' => 242 
) 

당신이 항목 모델의 데이터를 편집하고 Saving Related Model Data (HABTM) 장에 동시에 해당 ItemsLocation 레코드와 다이빙을 저장하려면

.

기본적으로 HasAndBelongsToMany 관계를 저장할 때 Cake는 새로운 테이블을 저장하기 전에 조인 테이블의 모든 행을 삭제합니다. 예를 들어, 10 명의 자녀가있는 클럽이있는 경우. 그런 다음 2 명의 자녀로 클럽을 업데이트하십시오. 클럽은 12 세가 아니라 2 명의 자녀 만 있습니다.

그리고 :

3.7.6.5 hasAndBelongsToMany (HABTM)

독특한는 true (기본값) 케이크 먼저 업데이트 할 때, 새로운 것을 삽입하기 전에 외부 키 테이블에 관계 기존 레코드를 삭제하는 경우 기록. 따라서 기존의 연결은 업데이트 할 때 다시 전달되어야합니다.


다시 : FormHelper는 [0][Model][field] 구조 배열에서 Model.0.field 필드를 자동 완성하기에 충분 지능형 경우 댓글/편집

난 내 머리 위로 떨어져 모른다. 당신에게 올바른 구조를 줄 것

foreach ($this->data as &$data) { 
    $data = $data['ItemsLocation']; 
} 
$this->data = array('ItemsLocation' => $this->data); 

을, 그러나 그것은 틀림없이 아주 좋은 아니다 : 하지 경우, 당신은 쉽게 결과를 직접 조작 할 수 있습니다. 누구든지 Cakey가 그것을 할 수있는 방법이 있다면, 나는 모든 귀입니다. :)

+0

지금은 훨씬 더 의미가 있습니다. 아직 저는 벽돌 벽을 때리고 있습니다. 원래 게시물에 대한 내 편집을 보는 마음? – nickf

+0

** 데이터를 찾을 때 ** 형식이 약간 다를 수 있습니다. 내가 말하는 것은 ** 컨트롤러에 폼을 포스트하는 올바른 형식이다. ** POST 데이터를 받으면 컨트롤러에서'debug ($ this-> data)'를 시도한다. – deceze

+0

그러나보기와 같은 형식으로 할 필요가 없습니다 :'$ form-> input ('ItemsLocation.0.id')' – nickf