本文实例讲述了Yii CDBCriteria常用方法。分享给大家供大家参考,具体如下:
注:$c = new CDbCriteria();是ActiveRecord的一种写法,使ActiveRecord更加灵活,而不是手册中DAO(PDO)和Query Builder。
小小点评一下:感觉这部分手册做的一般。
链接地址:http://www.yiiframework.com/doc/api/1.1/CDbCriteria
这是Yii CDbCriteria的一些笔记和常用用法:
一、一个sql拼装的情况
Php代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
$criteria = new CDbCriteria; //函数方式 $criteria ->addCondition( "id=1" ); //查询条件,即where id = 1 $criteria ->addInCondition( 'id' , array (1,2,3,4,5)); //代表where id IN (1,23,,4,5,); $criteria ->addNotInCondition( 'id' , array (1,2,3,4,5)); //与上面正好相法,是NOT IN $criteria ->addCondition( 'id=1' , 'OR' ); //这是OR条件,多个条件的时候,该条件是OR而非AND $criteria ->addSearchCondition( 'name' , '分类' ); //搜索条件,其实代表了。。where name like '%分类%' $criteria ->addBetweenCondition( 'id' , 1, 4); //between 1 and 4 $criteria ->compare( 'id' , 1); //这个方法比较特殊,他会根据你的参数自动处理成addCondition或者addInCondition, //即如果第二个参数是数组就会调用addInCondition $criteria ->addCondition( "id = :id" ); $criteria ->params[ ':id' ]=1; //属性方式 $criteria ->select = 'id,parentid,name' ; //代表了要查询的字段,默认select='*'; $criteria ->join = 'xxx' ; //连接表 $criteria ->with = 'xxx' ; //调用relations $criteria ->limit = 10; //取1条数据,如果小于0,则不作处理 $criteria ->offset = 1; //两条合并起来,则表示 limit 10 offset 1,或者代表了。limit 1,10 $criteria ->order = 'xxx DESC,XXX ASC' ; //排序条件 $criteria ->group = 'group 条件' ; $criteria ->having = 'having 条件 ' ; $criteria ->distinct = FALSE; //是否唯一查询 |
实例:
Php代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
$criteria = new CDbCriteria(); $criteria ->select = 'table_name,model_id,sum(amount) total' ; $criteria ->group = 'table_name,model_id' ; $criteria ->addCondition( "$nIdcId=4" ); //也可以$criteria->condition = "$nIdcId=4"; $aResult = accessory_info::model()->findAll( $criteria ); $c = new CDbCriteria(); $c ->select = 't.id, t.created_at, t.outsource_id, t.user_id, t.operate, t.content' ; $c ->join = 'LEFT JOIN outsource ON outsource.id=t.outsource_id' ; $c ->condition = 'outsource.idc_id IN(' . implode( ',' , $idc_ids ) . ')' ; if ( $last_log_id ) { $c ->condition .= " AND t.id > $last_log_id" ; } $c ->limit = 20; $c ->order = 't.id DESC' ; $logs = OutsourceProcessLog::model()->findAll( $c ); |
批注:
1. 与DAO方式结果区别是:DAO方式 数组中的每一个元素仍是数组。而通过CDbCriteria方式,数组中的元素是对象。
2. 即使该功能很强大,仍有一些需求不能满足,此时仍需sql语句。比如select avg(num) amount from ****。
3. 打印运行后的结果,可更深入yii这么做是如何实现的
Php代码:
1
2
3
4
5
6
7
|
//可见 $c = new CDbCriteria(); $c ->join = "JOIN idc_user on t.id=idc_user.user_id" ; $c ->condition = "idc_user.idc_id=$idc_id" ; //运行后 object(CDbCriteria)#98 (12) { [ "select" ]=> string(1) "*" [ "distinct" ]=> bool(false) [ "condition" ]=> string(17) "idc_user.idc_id=6" [ "params" ]=> array (0) { } [ "limit" ]=> int(-1) [ "offset" ]=> int(-1) [ "order" ]=> string(0) "" [ "group" ]=> string(0) "" [ "join" ]=> string(38) "JOIN idc_user on t.id=idc_user.user_id" [ "having" ]=> string(0) "" [ "with" ]=> NULL [ "alias" ]=> NULL } //User::model()->with('Idcs')->findAll($c) |
二、mergeWith的情况
Php代码:
1
2
3
4
|
//在ActiveRecord中,增加条件限制 $this ->getDbCriteria()->mergeWith( array ( 'condition' => "idc_id IN ($ids)" , )); |
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。