2012-08-30 63 views
6

Yii中,我有一個已經工作的功能:添加情況下Yii的SQL命令對象語句

$sql = Yii::app()->db->createCommand(); 
$sql->select('A.name as client_name, B.name as product_name'); 
$sql->join('tableb B', 'A.id=B.product_id'); 
$sql->from('tablea A'); 
$sql->where('1 = 1'); 

現在我想一個微小的邏輯添加到PRODUCT_NAME領域,MYSQL這將是

CASE WHEN B.name = "sth" 
THEN B.name 
ELSE B.another_name 
END AS product_name 

是否有可能在select()函數中添加塊時塊?

回答

8

我在這裏用google搜索了兩個小時後在這裏問了一個問題,並在這裏搜索了很多。但10多分鐘後,我發現我已經得到了答案......

在select()方法的源代碼服用後一看,

public function select($columns='*', $option='') 
{ 
    if(is_string($columns) && strpos($columns,'(')!==false) 
     $this->_query['select']=$columns; 
    else 
    { 
     if(!is_array($columns)) 
      $columns=preg_split('/\s*,\s*/',trim($columns),-1,PREG_SPLIT_NO_EMPTY); 

     foreach($columns as $i=>$column) 
     { 
      if(is_object($column)) 
       $columns[$i]=(string)$column; 
      else if(strpos($column,'(')===false) 
      { 
       if(preg_match('/^(.*?)(?i:\s+as\s+|\s+)(.*)$/',$column,$matches)) 
        $columns[$i]=$this->_connection->quoteColumnName($matches[1]).' AS '.$this->_connection->quoteColumnName($matches[2]); 
       else 
        $columns[$i]=$this->_connection->quoteColumnName($column); 
      } 
     } 
     $this->_query['select']=implode(', ',$columns); 
    } 
    if($option!='') 
     $this->_query['select']=$option.' '.$this->_query['select']; 
    return $this; 
} 

,請注意第一個if語句,當一個字符串傳遞,它包含「(」時,$列變量將直接返回,這真的是我期待的

因此,解決辦法是:!

$sql->select('A.name as client_name, (CASE WHEN B.name = "sth" THEN B.name ELSE B.product_name END) as product_name'); 

要小心的是,其他外作爲product_name「的部分應該超出()部分。

+3

有時候自己比搜索引擎有用:) –

+0

謝謝,金招。可能花了我一些時間來解決這個問題,但是多虧了你,我花了一段時間在Google上打字並點擊了這個鏈接。 –

+1

@RichHarding很高興幫助你:) –