在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()函数中阻塞时是否可以添加这种情况?
经过谷歌搜索和搜索了很多,我在这里问了两个小时之后问了这个问题.但是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');
请注意别名部分“as product_name”应该在()部分之外.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。