本文实例讲述了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程序设计有所帮助。