1

complex (atleast i think it is complex)試合日程やイベント関連から選手を探す条件はこちら。

これで、複数のイベントに複数の競合他社のユーザー エントリが含まれるテーブルとのHTBTM関係ができました。events_competitors

ここでは、joins入会・交際の条件はこれでOKですが、 (黒帯チェック)と(成人チェック)の追加条件もeventsつけcompetitorsていきたいです。is_blackis_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 ダンプです。

選択しCompetitorます。idCompetitorfirst_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_idStatenameState. short_nameStatestatusStatecreatedStatemodifiedDegreeidDegreerank_idDegreenameDegreestatusDegreecreatedSchoolidSchoolnameSchooladdress1Schooladdress2SchoolcitySchoolzip_codeSchoolcountry_idSchoolstate_idSchoolphone_numberSchoolowner_nameSchoolestablishment_dateSchooltotal_competitorsSchoolstatusSchoolcreatedSchoolmodifiedTransactionidTransactioncompetitor_idTransactionnoncompetitor_idTransactioncreatedTransactionmodifiedTransactionmc_grossTransactionaddress_statusTransactionpayer_idTransactionaddress_streetTransactionpayment_dateTransactionpayment_statusTransactionaddress_zipTransactionfirst_nameTransactionaddress_country_codeTransactionaddress_nameTransactioncustomTransactionpayer_statusTransactionaddress_countryTransactionaddress_cityTransactionpayer_emailTransactionverify_signTransactiontxn_idTransactionpayment_typeTransactionlast_nameTransactionaddress_stateTransactionreceiver_emailTransactionitem_nameTransactionmc_currencyTransactionitem_numberTransactionresidence_countryTransactiontransaction_subjectTransactionpayment_grossTransactionshippingTransactiontest_ipnTransactionpending_reasonからcompetitorsAS Competitorleft JOIN event_competitors AS EventCompetitorON ( EventCompetitor. event_id= 3 AND EventCompetitor. is_black= 0 AND EventCompetitor. is_adult= 0) LEFT JOIN ranksAS RankON ( Competitor. rank_id= Rank. id) LEFT JOIN tournamentsAS TournamentON ( Competitor. tournament_id= Tournament. id) LEFT JOIN countriesAS CountryON ( Competitor. country_id= Country. id) LEFT JOIN statesAS StateON ( Competitor. state_id= State. id) LEFT JOIN degreesAS DegreeON ( Competitor. degree_id= Degree. id) LEFT JOIN schoolsAS ON ( . = .) LEFT JOIN AS ON ( . = . ) LEFT JOIN AS ON ( . = . ) LEFT JOIN AS ON School( Competitor. school_id= School. id)transactionsTransactionTransaction. competitor_id= Competitor. id)どこCompetitorで。status= 1 AND Competitor. payment_completed= 1 AND Competitor. weightgroup_id= 13 およびCompetitor. rank_id= 11 およびCompetitor. degree_id= '0' AND Competitor. gender= '女性' GROUP BY Competitor.id

上記の ref クエリの左結合条件は次のとおりです。

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

4

1 に答える 1

0

これには、包含可能な動作を使用する必要があります。詳細: http://book.cakephp.org/view/1323/Containable

  1. 競合モデルに追加してください。

var $actsAs = array('Containable');
  1. Competitor モデルのモデル関係を更新して、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_black と is_adult が常に必要なわけではない場合は、これらの条件をモデルから移動し、必要に応じて検索操作の contain パラメータを介して渡します。

于 2011-04-08T18:23:01.160 に答える