2014-07-13 4 views
1

CakePHP 2.3.6을 사용하고 있습니다. 프로젝트에서 일부 데이터를 검색하기 위해 hasMany 연관에 JOIN 쿼리를 사용하고 있습니다. 내 조건은 다음과 같아야합니다JOIN 쿼리, hasMany 연결에 조건 생성하기

User.gender='male' AND User.country='USA' 
AND 
(Education.level='under_graduate' AND Education.result >= 3.5 AND Education.institute='college 1') 
AND 
(Education.level='graduate' AND Education.result >= 3 AND Education.institute='college 2') 

내가 뭘하려 :

[User] => Array 
    (
     [conditions] => Array 
      (
       [AND] => Array 
        (
         [User.gender] => male 
         [User.country] => USA 
         [0] => Array 
          (
           [AND] => Array 
            (
             [Education.result >= ] => 3.5 
             [Education.level] => under_graduate 
             [Education.institute] => college 1 
            ) 

          ) 

         [1] => Array 
          (
           [AND] => Array 
            (
             [Education.result >= ] => 3 
             [Education.level] => graduate 
             [Education.institute] => college 2 
            ) 

          ) 

        ) 

      ) 

     [joins] => Array 
      (
       [0] => Array 
        (
         [table] => educations 
         [alias] => Education 
         [type] => INNER 
         [conditions] => Array 
          (
           [0] => Education.user_id=User.id 
          ) 

        ) 

      ) 

    ) 

그러나, 나는이 조건을 사용하여 검색 할 때, 그것은 나에게 빈을 반환 :이 조건 배열을 생성

$this->paginate['User']['conditions']['AND']['User.gender']='male'; 
$this->paginate['User']['conditions']['AND']['User.country']='USA'; 
$this->paginate['User']['joins'][]=array('table'=>'educations','alias'=>'Education','type'=>'INNER','conditions'=>array('Education.user_id=User.id')); 
$this->paginate['User']['conditions']['AND'][0]['AND']['Education.result >= ']=3.5; 
$this->paginate['User']['conditions']['AND'][0]['AND']['Education.level']='under_graduate'; 
$this->paginate['User']['conditions']['AND'][0]['AND']['Education.institute']='college 1'; 
$this->paginate['User']['conditions']['AND'][1]['AND']['Education.result >= ']=3; 
$this->paginate['User']['conditions']['AND'][1]['AND']['Education.level']='graduate'; 
$this->paginate['User']['conditions']['AND'][1]['AND']['Education.institute']='college 2'; 

결과 배열,하지만 이러한 조건을 충족하는 db 일부 알고 있습니다.

그래서 여기에 무슨 문제가 있습니까? 어떻게해야합니까? 도와주세요.

감사합니다.

+1

btw, 나는 SQL에서 좋은 해결책을 찾았습니다. http://stackoverflow.com/questions/3267609/mysql-join-query-for-multiple-tags-many-to-many-relationship-that-matches-al – cleverketchup

답변

1

그래서 저는 두 가지 교육을받은 사용자를 찾아야한다고 알고 있습니다. AND 문을 사용하는 조건에서 동시에 "대학 1"과 "대학 2"와 동등한 Educations.institute를 찾으려고합니다. 이는 동시에 불가능합니다. 따라서 같은 테이블에 여러 개의 조인을 추가하여이를 찾는 방법이 있습니다. 좋아요 :

$options['conditions']['User.gender']='male'; 
    $options['conditions']['User.country']='USA'; 
    $options['joins'][]=array(
     'table'=>'educations', 
     'alias'=>'FirstEd', 
     'type'=>'INNER', 
     'conditions'=>array('FirstEd.user_id=User.id') 
    ); 
    $options['joins'][]=array(
     'table'=>'educations', 
     'alias'=>'SecondEd', 
     'type'=>'INNER', 
     'conditions'=>array('SecondEd.user_id=User.id') 
    ); 
    $options['conditions']['AND'][0]['FirstEd.result']=3.5; 
    $options['conditions']['AND'][0]['FirstEd.level'] = 'under_graduate'; 
    $options['conditions']['AND'][0]['FirstEd.institute']='college 1'; 
    $options['conditions']['AND'][1]['SecondEd.result']=3; 
    $options['conditions']['AND'][1]['SecondEd.level']='graduate'; 
    $options['conditions']['AND'][1]['SecondEd.institute']='college 2'; 

    $this->Paginator->settings = $options; 
    $users = $this->Paginator->paginate('User'); 

가장 좋은 해결책은 아니지만 저에게는 효과적입니다.

+0

고마워요, 그 일하는 여기 :). 너 나 너무 많이 도와 줬어. 그런데 왜 이것이 최상의 솔루션이 아니라고 말했습니까? @ccleverketchup –

1

쿼리가 모든 AND 문을 사용하므로 성취 될 수 없습니다. 필드가 두 값을 가질 수 없으므로 Education.level = 'under_graduate''Education.level' = 'graduate' 행이 될 수 없습니다. 당신은 예를 들어, 쿼리에 OR을 추가해야합니다

User.gender='male' AND User.country='USA' 
AND 
(
    (Education.level='under_graduate' AND Education.result >= 3.5 AND Education.institute='college 1') 
    OR 
    (Education.level='graduate' AND Education.result >= 3 AND Education.institute='college 2') 
) 

난 그냥 괄호의 추가 세트를 추가하고 변경하고 또는 교육에 관한 두 절 사이. 잘하면 CakePHP 형식으로 변환 할 수 있어야합니다.

+0

그래, 나도 그렇게 생각 했어. 그래서 지금 당장 나는 이것을하고있다. 그러나 이것을 할 방법이 있습니까? 실제로, 나는 그것을 할 필요가 있습니다. 너는 어떤 생각을 가지고 있니? @ 엘리아 리야 –

+1

당신의 답을 얻은 것 같네요! 귀하가 구축을 위해 노력한 질문은 결과를 반환하지 않았지만 질문에 언급되지 않았기 때문에 궁극적 인 목표를 오해했습니다. 어쨌든 쿼리를 작성할 때 먼저 DB에서 직접 확인하여 결과가 예상 한 것인지 확인할 수 있습니다! –

+0

그래, 그게 사실이야, 먼저 해 봤어야 했어. 감사합니다 :) @ 엘리아 리 –