2014-07-13 47 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') 

我試了一下:

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

我產生這種情況陣:

[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 
          ) 

        ) 

      ) 

    ) 

但是,當我搜索使用這個條件下,返回我空結果數組,但我知道在db中有一些符合這些條件的。

那麼,這裏有什麼問題?我該怎麼辦 ?請幫幫我。

謝謝。

+1

順便說一句,我發現了一個很好的SQL解決方案。 http://stackoverflow.com/questions/3267609/mysql-join-query-for-multiple-tags-many-to-many-relationship-that-matches-al – cleverketchup

回答

1

所以我明白你需要找到一個有兩個教育的用戶。在您的AND條件下,您可以看到您正在試圖找到Educations.institute,這將等同於「大學1」和「大學2」,這是不可能的。所以,有一種方法可以通過爲同一個表添加多個連接來找到它。像這樣:

$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'連續。 您需要添加或在您的查詢,例如:

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

我只是額外增加了一套支架,改變了AND或有關教育的兩個分句之間。 希望你應該能夠將它翻譯成CakePHP格式,它將起作用!

+0

是的,我也這麼認爲,這就是爲什麼現在我正在這樣做。但是,有沒有辦法做到這一點?其實,我需要這樣做,而不是「或」。你有什麼主意嗎 ? @EllaRyan –

+1

聽起來像你有你的答案!您正在努力構建的查詢不會返回結果,但我錯誤地理解了您的最終目標,因爲它沒有在問題中說明。 無論如何,當您構建查詢時,它可以幫助您直接在數據庫上檢查它們,以確保結果符合您的期望! –

+0

是的,那是真的,我應該先做。謝謝:) @EllaRyan –