2012-12-10 1 views
0

나는 다음과 같은 모델이 : 나는 $this->Sync->find('all') 내가 배열을 다시 거의 방법을 얻을 할 경우CakePHP의 모델 자체에 참여하는 방법과 올바른 배열을 검색 할 수

App::uses('AppModel', 'Model'); 
class Sync extends AppModel { 
    public $belongsTo = array(
     'Unit' => array(
      'className' => 'Sync', 
      'foreignKey' => 'parent_id' 
     ) 
    ); 

    public $hasMany = array(
     'Consultant' => array(
      'className' => 'Sync', 
      'foreignKey' => 'parent_id' 
     ) 
    ); 
} 

내가 원하는 그것을 :

Array 
(
    [0] => Array 
     (
      [Sync] => Array 
       (
        [id] => 22222 
        [parent_id] => 22222 
        [statistic_date] => 2012-11-14 00:00:00 
       ) 

      [Unit] => Array 
       (
        [id] => 22222 
        [parent_id] => 22222 
        [statistic_date] => 2012-11-14 00:00:00 
       ) 

      [Consultant] => Array 
       (
        [0] => Array 
         (
          [id] => 11111 
          [parent_id] => 22222 
          [statistic_date] => 2011-12-15 00:00:00 
         ) 

        [1] => Array 
         (
          [id] => 33333 
          [parent_id] => 22222 
          [statistic_date] => 2011-12-14 00:00:00 
         ) 
       ) 
    ) 
) 

문제는 컨설턴트에게 조건을 부여하기 위해서입니다. 이처럼 :이 양식에

Array 
(
    [0] => Array 
     (

      [Unit] => Array 
       (
        [id] => 22222 
        [parent_id] => 22222 
        [statistic_date] => 2012-11-14 00:00:00 
       ) 

      [Consultant] => Array 
       (
         [id] => 11111 
         [parent_id] => 22222 
         [statistic_date] => 2011-11-15 00:00:00 
       ) 
    ) 

    [1] => Array 
     (

      [Unit] => Array 
       (
        [id] => 22222 
        [parent_id] => 22222 
        [statistic_date] => 2012-12-14 00:00:00 
       ) 

      [Consultant] => Array 
       (
         [id] => 33333 
         [parent_id] => 22222 
         [statistic_date] => 2011-12-14 00:00:00 
       ) 
    ) 
) 

내가 원하는 :

$this->Sync->Consultant->find('all', array(
    'conditions' => array(
     'Consultant.statistic_date BETWEEN ? AND ?' => 'array(
      '2011-12-01 00:00:00', '2011-12-31 00:00:00' 
     )' 
    ) 
)) 

그러나 그것은 나에게 다시 원하는 배열을 제공하지 않습니다

Array 
(
    [0] => Array 
     (

      [Unit] => Array 
       (
        [id] => 22222 
        [parent_id] => 22222 
        [statistic_date] => 2012-11-14 00:00:00 
       ) 

      [Consultant] => Array 
       (
        [0] => Array 
         (
          [id] => 11111 
          [parent_id] => 22222 
          [statistic_date] => 2011-12-15 00:00:00 
         ) 
        [1] => Array 
         (
          [id] => 33333 
          [parent_id] => 22222 
          [statistic_date] => 2011-12-14 00:00:00 
         ) 
       ) 
    ) 
) 

당신은 어떻게 그것을 달성합니까? 내가 생각할 수있는 가능한 해결책은 contain 또는 Hash :: class를 사용하는 것이지만 어떻게해야할지 모르겠다.

모든 문제에 대한 도움을 주시면 대단히 감사하겠습니다.

답변

1

, 나는이 문제를 해결했다. 이것이 내가 한 일이다. 이 날을 제공

App::uses('AppModel', 'Model'); 

    class Sync extends AppModel { 
    function unit() { 
     $this->bindModel(array(
      'hasMany' => array(
       'Consultant' => array(
        'className' => 'Sync', 
        'conditions' => array(
         'Consultant.statistic_date BETWEEN ? AND ?' => array('2011-12-01 00:00:00', '2011-12-31 00:00:00') 
        ), 
        'foreignKey' => 'parent_id' 
       ) 
      ) 
     )); 

     return $this->find('all', array(
      'conditions' => array(
       'Sync.id = Sync.parent_id' 
      ) 
     )); 
    } 
} 

:

Array 
(
    [0] => Array 
     (

      [Sync] => Array 
       (
        [id] => 22222 
        [parent_id] => 22222 
        [statistic_date] => 2012-11-14 00:00:00 
       ) 

      [Consultant] => Array 
       (
        [0] => Array 
         (
          [id] => 11111 
          [parent_id] => 22222 
          [statistic_date] => 2011-12-15 00:00:00 
         ) 
        [1] => Array 
         (
          [id] => 33333 
          [parent_id] => 22222 
          [statistic_date] => 2011-12-14 00:00:00 
         ) 
       ) 
    ) 
) 
+0

[Sync] 및 [Consultant] 배열을 결합하여 사용자 정의 루프가 아닌 모델 변경을 통해 하나의 결합 된 배열을 얻을 수있는 방법이 있습니까? –

2

원하는 효과를 얻으려면 동기화 모델에서 찾기를 수행해야하며 먼저 포함하려고 시도합니다. 이 페이지의 지침에 따라 수용 할 수 있도록 모델을 설정하십시오. http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html

다음과 같은 메시지가 표시됩니다.

$this->Sync->find('all', 
array(
    'contain'=> 
     array('Consultant'=> 
         array(
         'conditions' => 
          array(
           'Consultant.statistic_date BETWEEN ? AND ?' => 'array(
           '2011-12-01 00:00:00', '2011-12-31 00:00:00' 
           )' 
           ) 
          ) 


      ) 
    ) 
); 
+0

응용 프로그램이 시도 영원히 작동하고 나는 즉석에서 모델을 결합한다. 내 말은, 몇 분 안에 아무것도받지 못한다는 뜻입니다. 나는 syncs 테이블에 약 22,000 개의 행을 가지고 있지만 이것이 문제가 될 것이라고는 생각하지 않는다. 이 문제를 해결할 다른 방법이 있습니까? – CalvinMcGee

+0

재귀 적으로 -1을 설정해 보았습니다.다른 옵션은 수동으로 조인하는 것입니다. http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#joining-tables –

+0

여전히 올바르게 작동하지 않습니다. 내 대답을 참조하십시오. – CalvinMcGee

0

좋아, 나는 동기의 행의 수를 감소 이것은 나에게주는 것입니다 :

array(
(int) 0 => array(
    'Sync' => array(
     'id' => '11111', 
     'parent_id' => '11111', 
     'statistic_date' => '2012-12-11 00:00:00' 
    ), 
    'Unit' => array(
     'id' => '11111', 
     'parent_id' => '11111', 
     'statistic_date' => '2012-12-11 00:00:00' 
    ), 
    'Consultant' => array(
     (int) 0 => array(
      'id' => '11111', 
      'parent_id' => '11111', 
      'statistic_date' => '2012-12-11 00:00:00' 
     ), 
     (int) 1 => array(
      'id' => '22222', 
      'parent_id' => '11111', 
      'statistic_date' => '2011-12-14 00:00:00' 
     ), 
     (int) 2 => array(
      'id' => '33333', 
      'parent_id' => '11111', 
      'statistic_date' => '2011-12-15 00:00:00' 
     ) 
    ) 
), 
(int) 1 => array(
    'Sync' => array(
     'id' => '22222', 
     'parent_id' => '11111', 
     'language_code' => null, 
     'statistic_date' => '2011-12-14 00:00:00' 
    ), 
    'Unit' => array(
     'id' => '11111', 
     'parent_id' => '11111', 
     'statistic_date' => '2012-12-11 00:00:00' 
    ), 
    'Consultant' => array() 
), 
(int) 2 => array(
    'Sync' => array(
     'id' => '33333', 
     'parent_id' => '11111', 
     'statistic_date' => '2011-12-15 00:00:00' 
    ), 
    'Unit' => array(
     'id' => '11111', 
     'parent_id' => '11111', 
     'language_code' => null, 
     'statistic_date' => '2012-12-11 00:00:00' 
    ), 
    'Consultant' => array() 
) 
내가 무엇을 달성하고자하는에 가까운

)

하지만, 정확히 . 동기화 모델을 표시하고 싶지 않고 나머지는 배열하지 않고 [0] 만 배열합니다.

해시 :: 추출물 ($ 데이터 '{N} .Consultant')를 사용하여 제공합니다

array(
(int) 0 => array(
    (int) 0 => array(
     'id' => '11111', 
     'parent_id' => '11111', 
     'statistic_date' => '2012-12-11 00:00:00' 
    ), 
    (int) 1 => array(
     'id' => '22222', 
     'parent_id' => '11111', 
     'statistic_date' => '2011-12-14 00:00:00' 
    ), 
    (int) 2 => array(
     'id' => '33333', 
     'parent_id' => '11111', 
     'statistic_date' => '2011-12-15 00:00:00' 
    ) 
), 
(int) 1 => array(), 
(int) 2 => array() 

)

을 그리고 추가로 해시 :: 필터()이에 satistying 결과를 줄 것이다, id = parent_id의 행만이 존재하지 않는 경우.

해시 :: 필터() 제공합니다

array(
(int) 0 => array(
    (int) 0 => array(
     'id' => '11111', 
     'parent_id' => '11111', 
     'statistic_date' => '2012-12-11 00:00:00' 
    ), 
    (int) 1 => array(
     'id' => '22222', 
     'parent_id' => '11111', 
     'statistic_date' => '2011-12-14 00:00:00' 
    ), 
    (int) 2 => array(
     'id' => '33333', 
     'parent_id' => '11111', 
     'statistic_date' => '2011-12-15 00:00:00' 
    ) 
) 

) 확인