2011-04-08 30 views
1

這是我的complex (atleast i think it is complex)條件從匹配時間表中查找競爭對手並與事件相關。CakePHP多JOIN查找所有條件問題

現在我有HTBTMevents_competitors表的關係,其中多個事件有多個競爭者用戶的條目。

在這裏,我已經使用joins條件加入並獲得相關eventscompetitors工作正常,但我也想申請附加條件,爲is_black(檢查是否有黑帶)和is_adult(檢查是否有成年人)

'EventCompetitor.is_black' => 0, 
'EventCompetitor.is_adult' => 0, 

這裏我只想要那些同時具有條件(is_black/is_adult)0的競爭者,意味着不符合條件,但它不會應用相同的結果,從而導致錯誤的競爭結果。

下面是我的整個發現條件:

$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' 

           ) 

          ); 

任何想法,我怎樣才能應用到JOIN條件的那些東西,所以它被應用到結果。

謝謝!

以下是您參考SQL轉儲:

選擇CompetitoridCompetitorfirst_nameCompetitorlast_nameCompetitorparent_nameCompetitorgenderCompetitordate_of_birthCompetitoremail_addressCompetitorweightCompetitorweightgroup_idCompetitorheightCompetitorrank_idCompetitordegree_idCompetitorphotoCompetitorschool_idCompetitoryears_of_experienceCompetitorageCompetitortournament_idCompetitortotal_registration_feesCompetitoraddress1Competitoraddress2CompetitorcityCompetitorzip_codeCompetitorcountry_idCompetitorstate_idCompetitorphone_numberCompetitormobile_numberCompetitorpayment_modeCompetitoremail_sentCompetitorpayment_completedCompetitorstatusCompetitorcreatedCompetitormodifiedRankidRanknameRankstatusRankcreatedRankmodifiedTournamentidTournamenttournament_nameTournamenttournament_typeTournamenttournament_dateTournamentvenue_nameTournamentaddress1Tournamentaddress2TournamentcityTournamentzip_codeTournamentcountry_idTournamentstate_idTournamentcreatedTournamentmodifiedCountryidCountrynameCountrystatusCountrycreatedCountrymodifiedStateidStatecountry_idStatenameStateshort_nameStatestatusStatecreatedStatemodifiedDegreeidDegreerank_idDegreenameDegreestatusDegreecreatedSchoolidSchoolnameSchooladdress1Schooladdress2SchoolcitySchoolzip_codeSchoolcountry_id,Schoolstate_idSchoolphone_numberSchoolowner_nameSchoolestablishment_dateSchooltotal_competitorsSchoolstatusSchoolcreatedSchoolmodifiedTransactionidTransactioncompetitor_idTransactionnoncompetitor_idTransactioncreatedTransactionmodifiedTransactionmc_grossTransactionaddress_statusTransactionpayer_idTransactionaddress_streetTransactionpayment_dateTransactionpayment_statusTransactionaddress_zip,Transactionfirst_name,Transactionaddress_country_codeTransactionaddress_nameTransactioncustomTransactionpayer_statusTransactionaddress_countryTransactionaddress_cityTransactionpayer_emailTransactionverify_signTransactiontxn_idTransactionpayment_typeTransactionlast_nameTransactionaddress_stateTransactionreceiver_emailTransactionitem_nameTransactionmc_currencyTransactionitem_number,Transactionresidence_country,Transactiontransaction_subjectTransactionpayment_gross,TransactionshippingTransactiontest_ipnTransactionpending_reason FROM competitors AS Competitor左JOIN event_competitors AS EventCompetitor ON(EventCompetitorevent_id = 3 AND EventCompetitoris_black = 0 AND EventCompetitoris_adult = 0)LEFT JOIN ranks AS Rank ON(Competitorrank_id = Rankid)LEFT JOIN tournaments AS Tournament ON(Competitortournament_id = Tournamentid)LEFT JOIN countries AS Country ON(Competitorcountry_id = Countryid)LEFT JOIN states AS State ON(Competitorstate_id = Stateid)LEFT JOIN degrees AS Degree ON(Competitordegree_id = Degreeid)LEFT JOIN schools AS School ON(Competitorschool_id = Schoolid)LEFT JOIN transactions AS Transaction ON(Transactioncompetitor_id = Competitorid)其中Competitorstatus = 1 AND Competitorpayment_completed = 1 AND Competitorweightgroup_id = 13 AND Competitorrank_id = 11 AND Competitordegree_id ='0'和Competitorgender ='女'GROUP BY Competitorid

這裏是從左邊上面的查詢的連接條件參考:

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

+0

請格式化您的代碼,並從調試中複製SQL轉儲。 – Headshota 2011-04-08 08:11:41

+0

當然,給我幾分鐘... – 2011-04-08 08:57:35

回答

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並不總是需要關係,您可能需要將這些條件從模型中移出並根據需要通過find操作的contains參數傳遞它們。

+0

嗨,謝謝你的好回覆,但我試過相同的,這不會幫助我在取得結果..你可以交換你的郵件ID,所以我可以問你更多。 。 – 2011-04-11 05:40:12

+0

有沒有什麼辦法,我可以檢查一個容器是否適用於在蛋糕中查找查詢? – 2011-04-11 05:50:54

+0

我嘗試了相同的方法,但是它並沒有多大幫助,即使它在應用可包含行爲後沒有運行'event_id'連接條件。 – 2011-04-11 08:13:29