2013-11-26 2 views
1

나는 조건의 상당히 복잡한으로 find('all')을하고 있어요 :CakePHP의 : 여러 관련 기록이있을 때 반환 필드를 지정하는 방법

array(
    (int) 0 => array(
     'User' => array(
      'id' => '381' 
     ), 
     'Resume' => array(
      'id' => '15' 
     ), 
     'Attempt' => array(
      (int) 0 => array(
       'id' => '16072', 
       'user_id' => '381', 
       'test_id' => '8', 
       'status' => 'complete' 
      ), 
      (int) 2 => array(
       'id' => '16073', 
       'user_id' => '381', 
       'test_id' => '8', 
       'status' => 'complete' 
      ) 
: 반환 된 데이터는 다음과 같습니다

array(
    'conditions' => array(
     (int) 0 => 'Attempt.test_id = 8', 
     (int) 1 => 'Attempt.score > 60', 
     (int) 2 => array(), 
     (int) 3 => array(
      (int) 0 => 'Resume.has_file = 1' 
     ) 
    ), 
    'joins' => array(
     (int) 0 => array(
      'table' => 'attempts', 
      'alias' => 'Attempt', 
      'type' => 'LEFT', 
      'conditions' => array(
       (int) 0 => 'Attempt.user_id = User.id AND Attempt.test_id != 5' 
      ) 
     ) 
    ), 
    'contain' => array(
     (int) 0 => 'Resume', 
     (int) 1 => 'Attempt', 
     (int) 2 => 'Tag' 
    ), 
    'group' => 'User.id', 
    'limit' => (int) 1, 
    'fields' => array(
     (int) 0 => 'User.id', 
     (int) 1 => 'Resume.id' 
    ) 
) 

쿼리를 실행하는 데 영원히 그리고 하루가 걸리고 User.id 만 필요하므로 불필요한 필드를 제거하려고합니다. 그것은 hasOne 연관을 위해 작동하지만 hasMany는 문서의 구문과 일치하지 않습니다. 예를 들어 'limit'=>array('Attempt.id')은 $ user [ 'Attempt'] [ 'id']가 없기 때문에 오류가 발생합니다. 대신 $ user [ 'Attempt'] [#] [ 'id']입니다.

어떻게하면됩니까? 또한이 쿼리의 속도를 높이는 조언을 듣고 싶습니다.

답변

0

내가 좋아할만한 것이 있습니다.

처음에는 User.id 만 필요하다는 것을 알았지 만 포함 된 항목에 더 많은 연관을 추가 했으므로 "태그"가 제거됩니다.

CakePHP가 기본적으로 사용하는 유형의 수동 결합을 수행하고 있음을 알 수 있습니다. 예를 들어 거기에 아무런 추가 조건이 설정되어 있지 않은 것으로 보입니다. 전술 한 조건을 가진 즉석에서 모델, 즉

$this->User->unbindModel(array('hasMany' => array('Attempt'))); 
//I dont know if its a hasMany, I just assumed that 
$this->User->bindMode(array('hasMany'=> array(
    'Attempt' => array('conditions' => array('Attempt.test_id <>' => 5))))); 

재개 모델로 반복.

나는 그룹화를하고 있지만 아직 집계 함수가 보이지 않습니다. 왜 거기에 그룹화되어 있습니까? 너는 무엇을 필요로 하는가? Hash :: extrat()로 해결할 수 있습니까?

데이터베이스 콘솔에서 직접 쿼리를 실행하고 도움이 될만한 인덱스가 있는지 확인하십시오.

마지막으로, 귀하의 요구 사항에 대해 확실하지 않지만 두 조건 (시도 및 재개 모델)을 충족해야합니까? 그렇다면 "내부 조인"이 필요합니다

+0

고마워요. Guillermo. 나는이 쿼리가 태그 모델에 어떤 조건도 가지지 않았음에도 불구하고 많은 것들이 그렇게 할 것이라는 것을 분명히해야만했다. 그래서 나는 그것을 없애거나 어떤 협회도 제거 할 수 없습니다. – emersonthis

+0

좋아, 아마 우리가 조건의 전체 집합과 당신이 더 나은 당신을 도울 수있는이 쿼리에서 필요한 것을 말해. –

+0

다음은 전체 조건 집합입니다. 나는 단지 User.id를 얻을 필요가있다. 다른 모든 포함 물은 필터 일뿐입니다. 다양한 조건이 해당 테이블을 참조합니다. – emersonthis

관련 문제