2011-04-08 2 views
1

성냥 스케쥴과 이벤트와 관련된 경쟁자를 찾을 수있는 여기에 제 complex (atleast i think it is complex) 조건이 있습니다.CakePHP multiple join JOIN findAll 조건 문제

이제 HTBTMevents_competitors 테이블과의 관계가 있는데, 여기에는 여러 이벤트에 여러 경쟁자 사용자 항목이 있습니다. 여기

, 내가 가입하고 잘 작동 competitorsevents 관련 얻기 위해 joins 조건을 사용했지만, 나는 또한 (블랙 벨트를 확인) is_black에 대한 추가 조건을 적용 할 및 is_adult

(성인 사람을 확인)
'EventCompetitor.is_black' => 0, 
'EventCompetitor.is_adult' => 0, 

두 조건 (is_black/is_adult)이 모두 0 인 경쟁 업체는 자격이 없다는 것을 의미하지만 동일한 경쟁 업체는 경쟁 업체가 아닌 결과를 초래합니다. 내가 JOIN 조건에 적용하는 일을 얻을 수 있도록하는 방법을

$matchdivisions = $this->Competitor->find("all" , 

           array(

           'conditions' => 

            array(

        'Competitor.status' => 1, 
        'Competitor.payment_completed' => 1, 
        'Competitor.weightgroup_id' => $current_matchsc['Matchschedule']['weightgroup_id'], 
        'Competitor.rank_id' => $current_matchsc['Matchschedule']['rank_id'], 
        'Competitor.degree_id' => $current_matchsc['Matchschedule']['degree_id'], 
        'Competitor.gender' => $current_matchsc['Matchschedule']['gender'], 

            ), 

            'joins' => 

             array(

             array(

              'table' => 'event_competitors', 
              'alias' => 'EventCompetitor', 
              'type' => 'left', 
              'conditions'=> array(

               "AND" =>array(

         'EventCompetitor.event_id = '.$current_matchsc['Event']['id'], 
         'EventCompetitor.is_black' => 0, 
         'EventCompetitor.is_adult' => 0, 

                ) 
               ), 
              ) 
            ), 

            'group' => 'Competitor.id' 

           ) 

          ); 

어떤 생각, 그 결과에 적용됩니다

다음은 내 모든 찾기 조건이다.

감사합니다.

Competitor를 선택

다음은 귀하의 심판에 대한 SQL 덤프입니다. id, Competitor. first_name, Competitor. last_name, Competitor. parent_name, Competitor. gender, Competitor. date_of_birth, Competitor. email_address, Competitor. weight, Competitor. weightgroup_id, Competitor. height, Competitor. rank_id, Competitor. degree_id, Competitor. photo, Competitor. school_id, Competitor. years_of_experience, Competitor. age, Competitor. tournament_id, Competitor. total_registration_fees, Competitor. address1, Competitor. address2, Competitor. city, Competitor. zip_code, Competitor. country_id, Competitor. state_id, Competitor. phone_number, Competitor. mobile_number, Competitor. payment_mode, Competitor. email_sent, Competitor. payment_completed, Competitor. status, Competitor. created, Competitor. modified, Rank. id, Rank. name, Rank. status, Rank. created, Rank. modified, Tournament. id, Tournament. tournament_name, Tournament. tournament_type, Tournament. tournament_date, Tournament. venue_name, Tournament. address1, Tournament.address2, Tournament. city, Tournament. zip_code, Tournament. country_id, Tournament. state_id, Tournament. created, Tournament. modified, Country. id, Country. name, Country. status, Country. created, Country. modified, State. id, State. country_id, State. name, State. short_name, State. status, State. created, State. modified, Degree. id, Degree. rank_id, Degree. name, Degree. status, Degree. created, School. id, School. name, School. address1, School. address2, School. city, School. zip_code, School. country_id, School. state_id, School. phone_number, School. owner_name, School. establishment_date, School. total_competitors, School. status, School. created, School. modified, Transaction. id, Transaction. competitor_id, Transaction. noncompetitor_id, Transaction. created, Transaction. modified, Transaction. mc_gross, Transaction. address_status, Transaction. payer_id, Transaction. address_street, Transaction. payment_date, Transaction. payment_status, Transaction. address_zip, Transaction. first_name, Transaction. address_country_code, Transaction. address_name, Transaction. custom, Transaction. payer_status, Transaction. address_country, Transaction. address_city, Transaction. payer_email, Transaction. verify_sign, Transaction. txn_id, Transaction. payment_type, Transaction. last_name, Transaction. address_state, Transaction. receiver_email, Transaction. item_name, Transaction. mc_currency, Transaction. item_number, Transaction. residence_country, Transaction. transaction_subject, Transaction. payment_gross, Transaction. shipping, Transaction. test_ipn, Transaction. Competitor AS competitorspending_reason FROM는 ON EventCompetitor AS 왼쪽 event_competitors 가입 (EventCompetitor. event_id = 3 AND EventCompetitor. is_black = 0을 EventCompetitor. is_adult = 0)가 LEFT Rank ON (Competitor AS ranks 가입.rank_id = Rank. id) 왼쪽 (Competitor ON Tournament AS tournaments 가입. = Tournamenttournament_id한다. id) LEFT이 Country ON (Competitor AS countries 가입. = Countrycountry_id한다. id) LEFT이 State AS (Competitor ON을 states 가입. = Statestate_id한다. id) LEFT이 degrees 가입 ON Degree AS (Competitor. degree_id = Degree. id) 왼쪽 (Competitor ON School AS schools 가입. = Schoolschool_id있다. id) LEFT JOIN transactions AS Transaction ON (Transaction). competitor_id = Competitor. id) WHERE Competitor. status = 1 AND Competitor. payment_completed = 1 AND Competitor. weightgroup_id = 13 AND Competitor. rank_id = 11 및 Competitor. degree_id = '0'AND Competitor. gender = '여성'GROUP BY Competitor. id

다음은 왼쪽이 타이밍에서 쿼리 위의 조건을 조인 :이의 함유 성 행동을 사용해야

left JOIN event_competitors AS EventCompetitor ON (EventCompetitor.event_id = 3 AND EventCompetitor.is_black = 0 AND EventCompetitor.is_adult = 0)

+0

코드를 포맷하고 디버그에서 SQL 덤프를 복사하십시오. – Headshota

+0

확실 해요, 몇 분만 기다려주세요 ... –

답변

0

. 더보기 : http://book.cakephp.org/view/1323/Containable

  1. 경쟁자 모델에 추가하십시오.

var $actsAs = array('Containable'); 
  1. 업데이트하여 경쟁 모델에서 모델 관계는 is_black 및 is_adult 조건을 포함합니다 :
 
var $hasAndBelongsToMany = array(
       'Competitor' => array(
        'className' => 'Competitor', 
        'joinTable' => 'event_competitors', 
        'alias' => 'EventCompetitor', 
        'conditions' => array(
         'EventCompetitor.is_black' => 0, 
         'EventCompetitor.is_adult' => 0 
        ) 
       ) 
      ); 

3)에 포함 된 배열을 전달, 이벤트 ID를 주입하기 위해 당신의 작업 찾기 :

$contain = array(
    'EventCompetitor' => array(
     'conditions' => array('EventCompetitor.event_id' => $current_matchsc['Event']['id']) 
    ) 
); 
$matchdivisions = $this->Competitor->find("all" , 
    array(
     'contain' => $contain, 
     'conditions' => array(
      'Competitor.status' => 1, 
      'Competitor.payment_completed' => 1, 
      'Competitor.weightgroup_id' => $current_matchsc['Matchschedule']['weightgroup_id'], 
      'Competitor.rank_id' => $current_matchsc['Matchschedule']['rank_id'], 
      'Competitor.degree_id' => $current_matchsc['Matchschedule']['degree_id'], 
      'Competitor.gender' => $current_matchsc['Matchschedule']['gender'] 
     ) 
    ) 
); 

만약 is_b 부족 및 is_adult가 항상 관계에 필요하지는 않다면 모델에서 해당 조건을 이동하여 필요에 따라 찾기 작업의 contains 매개 변수를 통해 전달할 수 있습니다.

+0

안녕하세요, 좋은 답장을 보내 주셔서 감사합니다.하지만 결과를 가져 오는 데 도움이되지 않는 같은 것을 시도해 보았습니다. 메일 ID를 교환하여 더 자세히 물어볼 수 있습니다. –

+0

거기에 어떤 방식 으로든, 나는 케이크에 내 find 쿼리와 containable 작품 여부를 확인할 수 있습니까? –

+0

나는 똑같이 시도했지만 많은 도움이되지 않는다. 포함 할 수있는 행동을 적용한 후에도 'event_id' 조인 조건을 실행하지 않고있다. –