CakePHP несколько JOIN найтиВсе проблемы условия - PullRequest
1 голос
/ 08 апреля 2011

Вот мое complex (atleast i think it is complex) условие поиска конкурентов по расписанию матчей и по событиям.

Теперь у меня есть HTBTM отношения с таблицей events_competitors, где несколько событий имеют несколько записей пользователей-конкурентов.

Здесь я использовал условие joins для соединения и связывания events с competitors, которое отлично работает, но я также хочу применить дополнительные условия для 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 для вашей ссылки:

SELECT Competitor. 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. pending_reason ОТ competitors AS Competitor оставлено JOIN. Event_competitors AS EventCompetitor ON (EventCompetitor. event_id = 3 AND EventCompetitor. is_black = 0 AND EventCompetitor. is_adult = 0) LEFT JOIN ranks AS Rank ON (Competitor. rank_id = Rank. id) LEFT JOIN tournaments AS Tournament ON (Competitor. tournament_id = Tournament. id) ЛЕВОЕ СОЕДИНЕНИЕ countries КАК Country ВКЛ (Competitor. country_id = Country. id) ЛЕВОЕ СОЕДИНЕНИЕ states КАК State ВКЛ (Competitor . state_id = State. id) ЛЕВОЕ СОЕДИНЕНИЕ degrees КАК Degree ВКЛ (Competitor. degree_id = Degree. id) ЛЕВОЕ СОЕДИНЕНИЕ schools КАК School ВКЛ (Competitor. school_id = School. id) ВЛЕВО СОЕДИНЯЕТСЯ transactions КАК Transaction ВКЛ (Transaction. competitor_id = Competitor. id) ГДЕ Competitor. status = 1 И Competitor. payment_completed = 1 И Competitor. weightgroup_id = 13 И Competitor. rank_id = 11 И Competitor. degree_id = '0' И 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)

1 Ответ

0 голосов
/ 08 апреля 2011

Для этого вы должны использовать сдерживаемое поведение.Больше на: 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) Чтобы внедрить идентификатор события, передайте содержащийся массив в операцию поиска:

$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 не всегда требуются дляотношения, вы хотели бы переместить эти условия из модели и передать их через параметр размещения операции поиска при необходимости.

...