2012-08-30 32 views
6

Trong Yii, tôi có một chức năng đã làm việc:Thêm trường hợp khi tuyên bố trong đối tượng lệnh 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'); 

Bây giờ tôi đang cố gắng để thêm một logic nhỏ đến lĩnh vực PRODUCT_NAME, trong MYSQL nó sẽ là

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

Có thể thêm trường hợp này khi hàm vào hàm select() không?

Trả lời

8

Tôi đã đặt câu hỏi ở đây sau khi đấu tranh trong 2 giờ bằng cách googled và tìm kiếm rất nhiều ở đây. Nhưng 10 phút sau, tôi thấy tôi đã có câu trả lời ...

Sau khi tham gia một cái nhìn tại các mã nguồn của phương pháp lựa chọn(), sự chú ý

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; 
} 

Pay đến 1 câu lệnh if, khi một chuỗi được thông qua và nó chứa "(", biến $ cột sẽ được trả trực tiếp, đó là thực sự những gì tôi đang tìm kiếm

vì vậy, các giải pháp sẽ là:!

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

chăm sóc rằng alia một phần "như product_name" nên được ra khỏi() phần.

+3

đôi khi bản thân bạn hữu ích hơn công cụ tìm kiếm :) –

+0

Cảm ơn, Jinzhao. Có thể đã đưa tôi một thời gian để làm việc này nhưng nhờ bạn nó chỉ mất thời gian tôi đã gõ vào Google và nhấp vào liên kết này. –

+1

@RichHarding Rất vui được giúp bạn ở đó :) –

Các vấn đề liên quan