6

YIIには、すでに機能している機能があります。

$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()関数でブロックするときにこのケースを追加することは可能ですか?

4

1 に答える 1

9

googledで2時間苦労した後、ここで質問し、ここでたくさん検索しました。しかし、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ステートメントに注意してください。文字列が渡され、それに「(」が含まれている場合、$ columns変数が直接返されます。これが、私が本当に探しているものです。

したがって、解決策は次のようになります。

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

「asproduct_name」のエイリアス部分が()セクションの外にあることに注意してください。

于 2012-08-30T07:18:40.970 に答える