2010-02-17 3 views
2

스포츠가 선택된 스포츠 인 게임 목록을 매김하고자합니다.파생 된 필드의 CakePHP 매김 조건

 $this->paginate = array('limit' => 30, 'page' => 1, 
    'conditions' => array('Competition.Team.sport_id' => '1'), 
     'contain' => array('Competition', 'Competition.Team', 
     'Gamefield', 'Changingroom', 'ChangingroomAway', 'Gametype'), 
    'order'=>array('game_date'=>'asc'),   
    ); 

사람이 수 : 다음은 작동하지 않습니다 내가하고 싶은 무엇 게임에 BelongsTo 경쟁에 BelongsTo 팀에 BelongsTo 스포츠 는 팀 = 1 을 sport_id 모든 게임을 보여줄 수 있습니다 : relatition는 다음과 같다 이거 도와 줘?

답변

5

내 해결책을 발견했습니다

var $paginate=array(
    'Game'=> 
    array(
     'joins'=>array(
      array('table'=>'competitions', 
        'alias'=>'Competition2', 
        'type'=>'left', 
        'conditions'=>array('Game.competition_id=Competition2.competition_id') 
       ), 
      array('table'=>'teams', 
        'alias'=>'Team2', 
        'type'=>'left', 
        'conditions'=>array('Competition2.team_id=Team2.team_id') 
       ), 
      ), 
     'order'=>array('game_date'=>'asc'), 
     'contains'=>array('Competition2'=>array('Team2')) 
        )); 
function index() { 
    $datum = date('Y-m-d H:m'); 
    $this->Game->recursive = 0; 
    $scope=array('OR' => array(array('Team2.sport_id' => 2), array('Team2.sport_id' =>3)), 'Game.game_date >' => $datum); 
//  Configure::write('debug',2); 
    $this->set('games', $this->paginate(null,$scope)); 
} 

감사를 TehThreag에 나를

+0

호기심에서 벗어나서 어떤 성능 저하가 발생하고 있습니까? 테이블이 크면 테이블에 2 개의 조인을 수행하는 것이 실제로 정말 느릴 수 있습니다. 비록 페이지 매김에 사용한 적이 없지만 Containable 비헤이비어는 이러한 조인에 대해 최적화 될 수 있습니다. 결국, 다 대다 조인은 데이터베이스 계층에서 매우 비쌀 수 있습니다. –

+1

이것은 프로덕션에서 사용되는 ad-hoc 조인의 좋은 예입니다. 많은 사람들이 여러 쿼리 대신 조인을 사용하는 방법을 찾고있는 것 같습니다. 여기에 완벽한 쇼가 있으며 그들에게 이야기합니다. –

+0

트래비스, 이것은 성능을 떨어 뜨리는 것이 아니라 여러 개의 쿼리를 포함 할 수있는 대신 하나의 쿼리 만 생성합니다. 결과 쿼리를 보면 두 개의 추가 조인을 제외하고 둘 다 동일한 쿼리를 수행한다는 것을 알 수 있습니다. contains를 사용하면이 쿼리 후에 추가 쿼리를 얻을 수 있습니다. – Michael

0

함유 성이 관계가 함유 성을 사용에도 불구하고, 어쨌든 합류했을하지 않는 한 조인을 생성하지 않는 데 도움을.

즉, habtm의 경우 참여를 원할 경우 Michael이 수행 한대로 수행해야합니다. 또한 위와 같은 데이터를 포함하는 결과에서 in (id1, id2, ... id #) 조건이 필요하므로 두 개의 조인을 수행하는 것이 어쨌든 Containable을 사용하여 habtm을 수행하는 것보다 논리적 인덱스를 사용하는 것이 빠릅니다 개별적인 관련 레코드를 가져 오기위한 다수의 쿼리가 있습니다.

조인 솔루션은 하나의 db 쿼리에서 데이터를 다시 가져옵니다.

관련 문제