2014-04-04 4 views
0

일반적인 판매자, 항목 및 이미지가있는 사이트가 있습니다. 모델은 다음과 같이 :CakePHP : 검색된 데이터의 형식이 연결된 모델에 따라 달라지는 이유

class Seller extends AppModel { 
    $hasMany = array('Item');  
    ... 
} 

class Item extends AppModel { 
    $belongsTo = array('Seller') 
    $hasMany = array('Image');  
    ... 
} 

class Image extends AppModel { 
    $belongsTo = array('Item'); 
    ... 
} 

내 문제는 내가 항목의 목록을 검색 할 때, 데이터가 나는 모든 항목의 목록을 얻고 여부에 따라 다른 형식에서 오는 것입니다 (로 표시 public) 또는 SellerController의 Seller 및 해당 항목에 대한 세부 정보를 제공합니다. Seller->find('first', ...)Images 요소가 Item 부분에 중첩되는 제 2 경우

array( 'Seller' => array(<seller stuff>), 
      'Item' => array of array (<item stuff> 
             'Images' => array of array(<image stuff>)); 

으로 항목을 검색하는 반면

간단히 Item->find('all')

array( 'Item' => array(<item stuff>), 
      'Images' => array of array(<image stuff>)); 

배열을 검색한다. 데이터를 다르게 형식화하면 View 코드를 다시 사용하기가 어려워집니다. 또한 내 상품 afterFind()이 제대로 작동하지 않을 경우 이미지 비트가 예상 한 곳에 있지 않을 때 문제가 발생합니다.

질문

2 상황에서 'Item' 부분 내에 중첩되는 'Images' 부분을 방지하는 간단한 방법이 있나요?

array(
(int) 0 => array(
    'Item' => array(
     'id' => '1', 
     'title' => 'tom item 1', 
     'seller_id' => '1' 
    ), 
    'Seller' => array(
     'id' => '1', 
     'name' => 'tom' 
    ), 
    'Images' => array(
     (int) 0 => array(
      'id' => '1', 
      'item_id' => '1', 
      'path' => 'tom_1_1' 
     ), 
     (int) 1 => array(
      'id' => '2', 
      'item_id' => '1', 
      'path' => 'tom_1_2' 
     ) 
    ) 
), 
(int) 1 => array(
    'Item' => array(
     'id' => '2', 
     'title' => 'tom item 2', 
     'seller_id' => '1' 
    ), 
    'Seller' => array(
     'id' => '1', 
     'name' => 'tom' 
    ), 
    'Images' => array(
     (int) 0 => array(
      'id' => '3', 
      'item_id' => '2', 
      'path' => 'tom_2_1' 
     ), 
     (int) 1 => array(
      'id' => '4', 
      'item_id' => '2', 
      'path' => 'tom_2_2' 
     ) 
    ) 
), 
... 

단일 판매자 + 관련 항목 :

// in ItemsController.php 
debug($this->Item->find('all')); 

이 생성됩니다

나는 더 많은 세부 사항 케이크를

모든 항목을 2.4

형식을 사용하고 있습니다 :

// In SellersController.php 
debug($this->Seller->find('first', 
      array('conditions' => array('id' => $id), 'recursive' => 2))); 

는 생산 :

array(
'Seller' => array(
    'id' => '1', 
    'name' => 'tom' 
), 
'Item' => array(
    (int) 0 => array(
     'id' => '1', 
     'title' => 'tom item 1', 
     'seller_id' => '1', 
     'Seller' => array(
      'id' => '1', 
      'name' => 'tom' 
     ), 
    // Look! 'Images' is WITHIN 'Item !!! 
     'Images' => array(
      (int) 0 => array(
       'id' => '1', 
       'item_id' => '1', 
       'path' => 'tom_1_1' 
      ), 
      (int) 1 => array(
       'id' => '2', 
       'item_id' => '1', 
       'path' => 'tom_1_2' 
      ) 
     ) 
    ), 
    (int) 1 => array(
     'id' => '2', 
     'title' => 'tom item 2', 
     'seller_id' => '1', 
     'Seller' => array(
      'id' => '1', 
      'name' => 'tom' 
     ), 
     'Images' => array(
      (int) 0 => array(
       'id' => '3', 
       'item_id' => '2', 
       'path' => 'tom_2_1' 
      ), 
      (int) 1 => array(
       'id' => '4', 
       'item_id' => '2', 
       'path' => 'tom_2_2' 
      ) 
     ) 
    ), 
.... 

답변

1

이 직접 Seller과 연관되지 않은 Image로 예상하고 올바른 행동이지만, Item와 함께.

ImageItem과 동일한 수준으로 정의 될 때 적절한 연결을 어떻게 결정하겠습니까? 이는 존재하지 않는 Seller과의 연관성을 나타냅니다.

다른 구조체를 원할 경우 afterFind 콜백 또는 적절한 위치에 서식을 지정하십시오. 그러나, 나는 CakePHP 표준에 반대하는 것을 시도하지 않는 것이 좋습니다. 해당되는 경우보기 코드를 수정하십시오.

0

귀하의 질문에 명확하지 않습니다. 2 번째로 이미지가 들어오는 것을 막으려 고한다면이 시도하십시오

$this->Seller->Item->unbindModel(array(
         'hasMany' => array('Image') 
    )); 

      $result = $this->Seller->find('first', 
       array('conditions' => array('id' => $id), 'recursive' => 2))); 

      debug($result);