php实现简单的SQL Builder
2016-07-10 17:31
423 查看
最近在使用Swoole C扩展来开发自己的项目, 本来想要使用golang 可是由于团队中的程序员大多数都是php 便放弃了。 我选用的是 swoole framework 来开发 后端api服务, 深入应用的时候 让我最痛苦的是那相当干净的官方文档, 最终我读了一遍源代码 才顺利上手 。
可能由于框架很久没有维护了 发现其orm中 有几处小bug, 于是便自己写了一个 简单的sql 构造器,还算挺方便的,贴下代码 。
经过测试应该没多大问题
可能由于框架很久没有维护了 发现其orm中 有几处小bug, 于是便自己写了一个 简单的sql 构造器,还算挺方便的,贴下代码 。
/** * PHPProject * SqlBuilder.php Created by usher.yue. * User: usher.yue * Date: 16/7/7 * Time: 下午12:32 * 心怀教育梦-烟台网格软件技术有限公司 */ class SqlBuilder{ /** * sql结果 * @var */ protected $_sql=""; protected $_select=""; protected $_from=""; protected $_where=""; protected $_update=""; protected $_insert=""; protected $_join=""; protected $_value=""; protected $_limit=""; protected $_set=""; protected $_method; protected $_order=""; //执行方式 const SQL_INSERT=0; const SQL_UPDATE=1; const SQL_SELECT=2; /** * clear sql */ public function clear(){ $this->_select=""; $this->_from=""; $this->_where=""; $this->_update=""; $this->_insert=""; $this->_method=""; $this->_value=""; $this->_set=""; $this->_limit=""; $this->_order=""; } /** * @param array $fields * @return $this */ public function select($fields=array()){ $this->clear(); $this->_method=SqlBuilder::SQL_SELECT ; if(is_array($fields)){ $selectFields=implode(' , ',$fields); $this->_select=($selectFields=="")?" * ":$selectFields; }else if(is_string($fields)){ $this->_select=$fields; } return $this; } /** * @param array $tables * @return $this */ public function from($tables=array()){ if(is_array($tables)){ $from=implode(',',$tables); $this->_from=' ' . $from .' '; }else if(is_string($tables)){ $this->_from=$tables; } return $this ; } /**配合表达式 * @param array $conditionExpr * @return $this */ public function wheres($conditionExpr=array()){ //拼接expr if(array_key_exists('expr',$conditionExpr)){ $this->_where.=$conditionExpr['expr']; unset($conditionExpr['expr']); } $arrSetExpr=[]; foreach($conditionExpr as $k=>$v){ $arrSetExpr[]="$k='$v'"; } $condition=implode(' and ',$arrSetExpr); $this->_where=($condition==''?$this->_where:$this->_where.' and '.$condition); return $this ; } /** * @param $conditon * @return $this */ public function where($conditon){ if(is_string($conditon)){ $this->_where.=" $conditon"; } else if(is_array($conditon)){ $arrCondition=[]; foreach($conditon as $k=>$v){ $arrCondition[]="$k='$v'"; } if(!empty($arrCondition)){ $this->_where.=implode(" and ",$arrCondition); } } return $this ; } /** * @param $condition * @return $this */ public function on($condition){ if(is_string($condition)){ $this->_join.=" on $condition "; }else if(is_array($condition)){ $arrCondition=[]; foreach($condition as $k=>$v){ $arrCondition[]="$k='$v'"; } $this->_join.=" on ".implode(" and ",$arrCondition); } return $this ; } /** * @param $tablename * @param string $join_type * @return $this */ public function join($tablename,$join_type='join'){ $this->_join.=" $join_type $tablename "; return $this ; } /** * @param $arr */ public function in($arr=""){ if(is_array($arr)){ foreach($arr as &$field){ $field='\''.$field.'\''; } $ins=' in (' .implode(',',$arr).')'; $this->_where.=" $ins"; }else if(is_string($arr)){ $this->_where.=" in($arr)"; } return $this; } /** * 支持关联数组和字符串 * @param $field */ public function and_($field){ if(is_string($field)){ $this->_where.=" and $field"; } else if(is_array($field)){ $arrCondition=[]; foreach($field as $k=>$v){ $arrCondition[]="$k='$v'"; } if(!empty($arrCondition)){ $this->_where.=" and ".implode(" and ",$arrCondition); } } return $this ; } /** * @param $condition * @return $this */ public function onOr($condition){ $this->_join.=" or $condition "; return $this; } /** * @param array $tables * @return $this */ public function update($tables){ $this->clear(); $this->_method=SqlBuilder::SQL_UPDATE ; if(is_array($tables)){ $this->_update=implode(",",$tables); }else if(is_string($tables)){ $this->_update=" $tables "; } return $this ; } /** * @param array $conditionExpr * @return $this */ public function set($conditionExpr=array()){ //拼接expr if(is_array($conditionExpr)){ if(array_key_exists('expr',$conditionExpr)){ $this->_set.=$conditionExpr['expr']; unset($conditionExpr['expr']); } $arrSetExpr=[]; foreach($conditionExpr as $k=>$v){ $arrSetExpr[]="$k='$v'"; } $condition=implode(' , ',$arrSetExpr); $this->_set=($this->_set==''?$condition:$this->_set.' , '.$condition); }else if(is_string($conditionExpr)){ $this->_set.=" $conditionExpr "; } return $this; } /** get sql * @return string */ public function sql(){ $sqlCmd=""; switch($this->_method){ case SqlBuilder::SQL_SELECT: { $sqlCmd="select {$this->_select} from {$this->_from}" ; if($this->_join){ $sqlCmd.=$this->_join; } if($this->_where){ $sqlCmd.=' where '.$this->_where; } if($this->_limit){ $sqlCmd.=$this->_limit; } break; } case SqlBuilder::SQL_UPDATE: { $sqlCmd="update {$this->_update } set {$this->_set}" ; if($this->_where){ $sqlCmd.=' where '.$this->_where; } break; } case SqlBuilder::SQL_INSERT: { $sqlCmd="insert into {$this->_insert } VALUES {$this->_value}" ; break; } } return $sqlCmd ; } /** * @param array $fields * @param array $values */ public function values($values=[[]]){ $valueList=[]; foreach($values as &$value){ foreach($value as &$v){ $v="'$v'"; } $valueList[]="(".implode(",",$value).")"; } $this->_value=implode(",",$valueList); return $this; } /** * @param array $table * @param array $fields * @return $this */ public function insertinto($table,$fields){ $this->clear(); $this->_method=SqlBuilder::SQL_INSERT; if(is_array($table)){ $this->_insert=implode(",",$table) ; }else if(is_string($table)){ $this->_insert=$table ; } if(is_array($fields)){ $insertFields=implode(',',$fields); if($insertFields!=""){ $this->_insert.= " ($insertFields) "; } }else if(is_string($fields)){ $this->_insert.= " ($fields) "; } return $this; } /** * @param $num */ public function limit($num,$offset=0){ if($offset<=0) $this->_limit=" limit $num"; else $this->_limit=" limit $num,$offset "; return $this ; } /** * @param $field */ public function orderby($field='',$order='desc'){ if(is_array($field)){ $this->_order=" ".implode(',',$field)." $order"; }else{ $this->_order=" $field $order"; } return $this ; } } //$builder=new SqlBuilder() ; //$builder->select(['a','b'])->from(['aa as ','bb vd'])->join("t1")->on("a=5")->onAnd("c=1")->wheres(['ax'=>1,'expr'=>"cx>=1"])->limit(100); //var_dump($builder->sql()); //$builder->update(['a','b'])->set(['a'=>1,'ss'=>2])->where("a>1")->whereAnd("b<1"); //var_dump($builder->sql()); //$builder->insertinto("table_1",["a","b","c","d"])->values([["aaa","bbb","ccc","ddd"],["aaa","bbb","ccc","ddd"],["aaa","bbb","ccc","ddd"]]); //var_dump($builder->sql()); //完整测试 //echo $builder->select("*")->from("a,b as 3")->join("b")->on(['ccsxx'=>34566,'dss'=>"3"])->where(["a4"=>12,"2b"=>32,"c23"=>"42"])->and_("b=2")->and_(["a"=>1,"b"=>2,"c"=>"4"])->and_("s")->in([1,2,3,43,2,77])->orderby("cc desc")->limit(1,2)->sql(); //echo $builder->insertinto("a","c,d,s,d,e")->values([[1,2,3,4,5],[2,3,4,5,6],[32,43,43,43]])->sql(); //echo $builder->update("a")->set("a=1,b=4,c=c+1")->where("c>c+1")->and_("c<6")->sql();
经过测试应该没多大问题
相关文章推荐
- 【荐】如何正确理解PHP之include,include_once,require,require_once等包含作用域
- map按key和value排序
- HDOJ/HDU 1242 Rescue(经典BFS深搜-优先队列)
- HDOJ/HDU 1242 Rescue(经典BFS深搜-优先队列)
- 数据库交互 query
- leetcode357. Count Numbers with Unique Digits
- 特殊权限-SUID,SGID,Sticky 学习笔记
- Mysql插入数据里有中文字符出现Incorrect string value的错误
- $_SERVER["SCRIPT_NAME"]、$_SERVER["PHP_SELF"]、$_SERVER["QUERY_STRING"]、$_SERVER["REQUEST_URI"]
- TI BIOS MCSDK 2.0 User Guide
- CSS链接四种状态注意顺序、UI伪类选择器的顺序
- UIView的layoutSubviews和drawRect
- 前景检测算法(十二)--基于模糊Choquet积分
- HDU 286 Data Handler <deque 双向队列>
- QML UI布局管理
- java中String类、StringBuilder类和StringBuffer类详解
- SoapUI 笔记13 JDBC请求
- leetcode:Top K Frequent Elements
- spark 解决办法 check your cluster UI to ensure that workers are registered and have sufficient memory
- iOS开发UI篇—使用storyboard创建导航控制器以及控制器的生命周期