2012-06-19 77 views
0

我試圖找出如何建立使用Yii的CDbCriteria的查詢將等同於以下的匹配多發行:Yii的CDbCriteria查詢在一個表中

SELECT 
     * 
FROM 
     user u 
JOIN ( 
     SELECT * 
     FROM skill_assessment s 
     WHERE s.skill = 'HTML' 
     AND s.score >= 80 
) b ON 
     (u.id = b.userId) 
JOIN ( 
     SELECT * 
     FROM skill_assessment s 
     WHERE s.skill = 'CSS3' 
     AND s.score >= 80 
) c ON 
     (u.id = c.userId); 
etc... 

這裏是我到目前爲止,該不工作:

$criteria = new CDbCriteria(); 
$criteria->alias = "u"; 
$criteria->select = "*"; 
$criteria->join = "JOIN skill_assessment s ON (u.id=s.userId)"; 
for($i = 0; $i < count($skill_filters); $i++) { 
    $criteria->addCondition("s.skill='".$skill_filters[$i]->skill."' AND s.score >= ".$skill_filters[$i]->level); 
} 

$users = UserModel::model()->findAll($criteria); 

任何幫助將不勝感激。 在此先感謝。

編輯: 我能夠構建出sql查詢作爲一個字符串,並使用findAllBySql,它返回了符合我的搜索條件的正確的UserModels,問題是我一直無法讓它返回相關的技能評估模型。他們不與初始查詢回來要麼,像這樣:

$users = UserModel::model()->with('skill_assessments')->findAllBySql($sql); 

也沒有,如果我得到的結果是這樣的:

$users = UserModel::model->findAllBySql($sql); 
foreach($users as $user) 
{ 
    $user->skill_assessments = $user->getRelated('skill_assessments'); 
} 

我如何能得到這些相關的模型有什麼想法? 奇怪的是,在我的應用程序的其他地方,我可以得到相關的模型,如果我這樣做:

$user = UserModel::model->findByPk($id); 
$user->skill_assessments->getRelated('skill_assessments'); 
+1

你可以閱讀文檔。 – adamors

回答

0

非常感謝鮑里斯Belenski! 你的建議是不是相當我需要什麼,但它確實讓我得到我需要的東西。下面是我最後的作品:

$str = "abcdefghijklmnopqrstuvwxyz"; 
      $idxs = str_split($str); 

      $criteria = new CDbCriteria(); 
      $criteria->alias = "u"; 
      $joins = array(); 
      for($i = 0; $i < count($skill_filters); $i++) 
      { 
       $joins[] = " JOIN (SELECT * FROM skill_assessment s WHERE s.skill = '" . $skill_filters[$i]->skill ."' AND s.score >= " . $skill_filters[$i]->level . ") " . $idxs[$i] . " ON (u.id = " . $idxs[$i] . ".userId) "; 
      } 

      $criteria->join = join(' ', $joins); 
      $users = UserModel::model()->findAll($criteria); 
      foreach($users as $user) 
      { 
       $user->skill_assessments = $user->getRelated('skill_assessments'); 
      } 

真正關鍵的部分是$連接數組。 這將允許您獲取匹配skill_assessments表中所有行匹配條件的所有用戶。

另外,我也許可以在普通視圖中延​​遲加載視圖中的技能評估,但我需要爲每個用戶現在獲取所有skill_assessments,以便將它們傳遞迴用戶的ajax響應中。

1

在這個層面上保持簡單:

$sql="select * from mytable where id = :id"; 
$cmd = Yii::app()->db->createCommand($sql)->bindParam("id", $res_id); 
$cmd->execute(); 
+0

請參閱我編輯的原始文章,瞭解如何手動構建SQL。 – jsteele

+0

請嘗試通過添加「一起」的標誌。 '與( 'skill_assessments') - >一起() - >' – Pentium10

2

addCondition二參數是默認'AND'。這是你想要的?可能是你應該爲$operator定義'OR'並在條件附近加上大括號。 但您的情況addCondition將通過應用於用戶表,而不是JOIN

我認爲這應該爲你工作:

$criteria = new CDbCriteria(); 
$criteria->alias = "u"; 
$criteria->together= "skill_assessment"; 
$where = array(); 

for($i = 0; $i < count($skill_filters); $i++) { 
    $where[] = "(s.skill='".$skill_filters[$i]->skill."' AND s.score >= ".$skill_filters[$i]->level . ')'; 
} 
$criteria->join = 'JOIN skill_assessment s ON (u.id=s.userId' . ($where ? (' AND (' . join(' OR ', $where) . ')') : '') . ')'; 

$users = UserModel::model()->findAll($criteria); 

取_skill_assessment_這樣的:

foreach($users->skill_assessment as $skill_assessment) 
{ 
    echo $skill_assessment->userId; 
}