2012-08-30 20 views
6

In YII habe ich eine bereits Arbeitsfunktion:case when-Anweisung in Yü SQL-Befehl Objekt

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

Jetzt würde ich versuche es seine

eine winzige Logik zum product_name Feld, in MYSQL hinzufügen

Ist es möglich, diese Fall, wenn Block in der Funktion select()?

Antwort

8

Ich stellte die Frage hier, nachdem ich 2 Stunden lang gegoogelt und viel gesucht hatte. Aber 10 Minuten später fand ich, dass ich die Antwort habe ...

Nach einem Blick auf den Quellcode von select() Methode nimmt,

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

Achten Sie auf die erste if-Anweisung, wenn ein String übergeben wird und es enthält „(“, wird die $ Spalten Variable direkt zurückgeführt werden, das ist wirklich das, was ich suche

So wird die Lösung sein:

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

darauf achten, dass die alia Der Teil "as product_name" sollte außerhalb des Abschnitts() sein.

+3

manchmal selbst ist nützlich als die Suchmaschine :) –

+0

Danke, Jinzhao. Ich hätte mir etwas Zeit nehmen können, um das auszuarbeiten, aber dank dir hat es nur die Zeit gedauert, in der ich in Google getippt und auf diesen Link geklickt habe. –

+1

@RichHarding Froh, dir da zu helfen :) –