QueryInterFaceAll()One()Count($q=‘*’,$db)Exists()indexBy($cloumn)//索引值或者使用回调函数where($condition)`['type'=1,'status'=2]`generates`(type=1)AND(status=2)`.`['id'=[1,2,3],'status'=2]`generates`(idIN(1,2,3))AND(status=2)`.`['status'=null]generates`statusISNULL`.`['and','id=1','id=2']`generate`id=1ANDid=2`.`['and','type=1',['or','id=1','id=2']]`generate`type=1AND(id=1ORid=2)`.Themethodwill*not*doanyquotingorescaping.`['between','id',1,10]`generate`idBETWEEN1AND10`.`['in','id',[1,2,3]]`generate`idIN(1,2,3)`.Tocreateacomposite`IN`conditionyoucanuseandarrayforthecolumnnameandvalue,wherethevaluesareindexedbythecolumnname:`['in',['id','name'],[['id'=1,'name'='foo'],['id'=2,'name'='bar']]]`嵌套条件`['in','user_id',(newQuery())-select('id')-from('users')-where(['active'=1])]``['like','name','tester']`generate`nameLIKE'%tester%'`.`['like','name',['test','sample']]`Generate`nameLIKE'%test%'ANDnameLIKE'%sample%'`Themethodwillproperlyquotethecolumnnameandescapespecialcharactersinthevalues.LIKE查询使用了过虑`['exists',(newQuery())-select('id')-from('users')-where(['active'=1])]``EXISTS(SELECTidFROMusersWHEREactive=1)``['=','id',10]``id=10`.addWhere()orWhere()filterWhere(array$condtion)忽略空值的查询andFilterWhere(array$condtion)orFilterWhere(array$condtion)orderBy($cloumns)e.g.idASC,nameDESC)oranarraye.g.`['id'=SORT_ASC,'name'=SORT_DESC]`addOrderBy($cloumns)limit($limit)offset($offset)yii\db\CommandYII的SQL命令创建类继承:Component执行INSERTUPDATEDELETE语句使用execute()执行SEELCT使用queryAll()queryOne()queryColumnqueryScalar()query()exp:$users=$connection-createCommand(‘SELECT*FROMuser’)-queryAll()在Command模式下,只要绑定了parameterSQL自动实现prepared预处理=====================================================属性:$db$pdoStatement$fetchMode=\PDO::FETCH_ASSOC$params=[]绑定的参数(name=value)会产生原生SQL$queryCacheDuration//缓存时间$queryCacheDependency//缓存地点$_pendingParams=[]//等待绑定到PDOStatement上的参数$_sql方法:Cache($duration=null,$dependency=null)//不指定会使用connection中的该属性noCache(){$this-queryCacheDuration=-1;}getSql()return$this-_sql;setSql($sql)//在第一个设置SQL的时候会清空SQL上的绑定参数,以及预处理的参数//将参数插入到占位符中getRawSql()获取原生SQLname=?anda=?[name=asage=a]name=,anda=测试语句:解析:name占位符Prepare($forRead=null)//参数是指定只读的预编译还是可写的//这个参数主要是为了实现读写分离ProtectedfunctionbindPendingParams(){}//为PDOStatement绑定值Cancel(){$this-pdoStatement=null}清除PDOStatement使用命名占位符使用问号占位符将使用1的索引值$dateType如果为空则使用这个值的PHP的类型这个地方的绑定是pdoStatement的bindParam,绑定后即可以执行bindParam($name,&$value,$dataType=null,$length=null,$driverOptions=null)这个并不是pdoStatement的bindValue,只是YII预处理的bindValue主要是设置$_pendingParams和$params的属性bindValue($name,$value,$dataType=null)bindValues($values)//返回一个DataReader对象Query(){return$this-queryInternal(‘’);}//返回一个结果数组queryAll($fetchMode=null){return$this-queryInternal(‘fetchAll’,$fetchMode’);}//返回一个数组或者是FLASEqueryOne()//返回一个字符串或者NULL或boolean第一行第一列没有值就返回falsequeryScalar()//返回一个数组或空数组queryColumn()insert($table,$columns)//待分析研究关联QueryBuilder.php后续的batchInsert()update(…)delete(…)createTable(…)renameTable(…)dropTable(….)truncateTable(…)addColumn(…)dropColumn(…)renameColumn(..)alterColumn(….)alertColumn(…)addPrimaryKey(…)dropPrimaryKey(…)addForeignKey(….)dropForeignKey(…)createIndex(….)dropIndex(…)resetSequence(…)checkIntegrity(….)execute()以上都只是返回了一个新的SQL语句使用了预处理$this-params的参数并没有真的绑到SQL,只是为了获取追踪SQL语句绑定更新例子$data=[];$cmd=\Yii::$app-db-createCommand();Yii\db\QueryBuilderConstPARAM_PREFIX=‘:qp’//定义绑定参数的前缀$db$separator=““$typeMap=[]$conditionBuilders=[‘NOT’=’buildNotCondition’,’AND’,’OR’,’BETWEEN’,NOTINLIKENOTLIKEORLIKEORNOTLIKEEXISTS,NOTEXISTS]//$query对象生成SELECT查询语句Build($query,$params=[])//生成INSERT查询语句因此Command的insert语句是预处理插入并自动加入字段标识``$sql=$queryBuilder-insert('user',['name'='Sam','age'=30,],$params);Insert($tale,$columns,&$params){使用:qp01…来生成_pendingParams将空的$params填充}$sql=$queryBuilder-batchInsert('user',['name','age'],[['Tom',30],['Jane',20],['Linda',25],]);//生成插入多条记录的SQL不支持预处理插入batchInsert($table,$columns,$rows)//更新语句支持预处理插入$params=[];$sql=$queryBuilder-update('user',['status'=1],'age30',$params);Update($table,$columns,$condition,&$params)$sql=$queryBuilder-delete('user','status=0');支持预处理Delete($table,$condition,&$params)createTable($table,$columns,$options=null)renameTable(….)//$columns需要查询的列数组buildSelect($columns,&$params,$distinct=false,$selectOption=null)