首页 > 代码库 > yii中数据的"增删改查"相关工作!(此文比较乱,需细看)

yii中数据的"增删改查"相关工作!(此文比较乱,需细看)

使用findByPk()根据数据表主键查询的是对象,不需要使用foreach()循环出来

但是使用findall()和find()查询的是对象类型的数组需要使用foreach()循环出来

=======================================




    public function getMinLimit () {
        $sql = "...";
        $result = yii::app()->db->createCommand($sql);
        $query = $result->queryAll();
        return array (
                $query [0] [‘max‘], 
        );
    }

 

 

 



$connection=Yii::app()->db; 
$sql="SELECT u.account,i.* FROM sys_user as u left join user_info as i on u.id=i.user_id";
$rows=$connection->createCommand($sql)->query();
foreach ($rows as $k => $v ){
    echo $v[‘add_time‘];
}

 

 

======================================== 事务

$db = Yii::app()->db;
$dbTrans = $db->beginTransaction();


$dbTrans->commit();
$dbTrans->rollback();

 

 

 

========================================  分页

 


一般写法:
$criteria = new CDbCriteria;
$count = DnOnline::model()->count($criteria);
$pages = new CPagination($count);               
$pages->pageSize = 5;
$pages->applylimit($criteria);
$model = DnOnline::model()->findAll($criteria);

记得控制器里有个函数paginate($itemCount,$pageSize=null,$pageVar=null)
CDB写法:
$criteria = new CDbCriteria;
$sql = "SELECT * FROM USER";
$model= Yii::app()->db->createCommand($sql)->queryAll();
$pages = new CPagination(count($model));               
$pages->pageSize = 4;
$pages->applylimit($criteria);
$model=Yii::app()->db->createCommand($sql." LIMIT :offset,:limit");
$model->bindValue(‘:offset‘, $pages->currentPage*$pages->pageSize);
$model->bindValue(‘:limit‘, $pages->pageSize);
$model=$model->queryAll();

或者:

      $criteria = new CDbCriteria;
      $connection=Yii::app()->db; 
      $sql="SELECT u.account,i.* FROM sys_user as u left join user_info as i on u.id=i.user_id ";
      $model= Yii::app()->db->createCommand($sql)->queryAll();
      $pages = new CPagination(count($model));               
      $pages->pageSize = 4;
      $pages->applylimit($criteria);

      $model=Yii::app()->db->createCommand($sql." LIMIT :offset,:limit");
      $model->bindValue(‘:offset‘, $pages->currentPage*$pages->pageSize);
      $model->bindValue(‘:limit‘, $pages->pageSize);
      $model=$model->queryAll();
======================================== 一、查询数据集合

1、$admin=Admin::model()->findAll($condition,$params);
该方法是根据一个条件查询一个集合,如:  
findAll("username=:name",array(":name"=>$username));    


2、$admin=Admin::model()->findAllByPk($postIDs,$condition,$params); 
findAllByPk($id,"name like ‘:name‘ and age=:age",array(‘:name‘=>$name,‘age‘=>$age));   
该方法是根据主键查询一个集合,可以使用多个主键,如:  
findAllByPk(array(1,2));   


3、$admin=Admin::model()->findAllByAttributes($attributes,$condition,$params); 
该方法是根据条件查询一个集合,可以是多个条件,把条件放到数组里面,如:  
findAllByAttributes(array(‘username‘=>‘admin‘));


4、$admin=Admin::model()->findAllBySql($sql,$params); 
该方法是根据SQL语句查询一个数组,如: 
findAllBySql("select *from admin whereusername=:name",array(‘:name‘=>‘admin‘)); 

========================================  二、查询对像的方法 

1、$admin=Admin::model()->findByPk($postID,$condition,$params);
 根据主键查询出一个对象,如:findByPk(1); 

 
 2、$row=Admin::model()->find($condition,$params);
 根据一个条件查询出一组数据,可能是多个,但是他只返回第一行数据,如: 
find(‘username=:name‘,array(‘:name‘=>‘admin‘));

 

      $userinfo=Userinfo::model()->find(array(‘condition‘=>‘user_id=:user_id‘,‘params‘=>array(‘:user_id‘=>$uid)));
      print_r($userinfo->user_id);

 

 


 3、$admin=Admin::model()->findByAttributes($attributes,$condition,$params);
 该方法是根据条件查询一组数据,可以是多个条件,把条件放到数组里面,他查询的也是第一条数据,如: 
findByAttributes(array(‘username‘=>‘admin‘));


 4、$admin=Admin::model()->findBySql($sql,$params);
 该方法是根据SQL语句查询一组数据,他查询的也是第一条数据,如:  
findBySql("select *from admin whereusername=:name",array(‘:name‘=>‘admin‘));


 5、拼一个获得SQL的方法,在根据find查询出一个对象 


$criteria=new CDbCriteria;  
$criteria->select=‘username‘; // only select the ‘title‘ column  
$criteria->condition=‘username=:username‘; 
$criteria->params=array(‘:username=>‘admin‘); 
$post=Post::model()->find($criteria); // $params isnot needed 
 
========================================  三、查询个数,判断查询是否有结果  

1、$n=Post::model()->count($condition,$params);
 该方法是根据一个条件查询一个集合有多少条记录,返回一个int型数字,如  
count("username=:name",array(":name"=>$username));   


 2、$n=Post::model()->countBySql($sql,$params);
 该方法是根据SQL语句查询一个集合有多少条记录,返回一个int型数字,如 
countBySql("select *from admin whereusername=:name",array(‘:name‘=>‘admin‘));


 3、$exists=Post::model()->exists($condition,$params); 
 该方法是根据一个条件查询查询得到的数组有没有数据,如果有数据返回一个true,否则没有找到 
        $sql = "select count(*) as count  from " . $this->tableName() . " where user_id = $userId";
        $query = $result->queryAll();
        $pageSize =10;
        $count = $query [0] [count];
        $pageCount = ceil($count / $pageSize);
        return $pageCount;

======================================== 四、添加的方法  
$admin=newAdmin;        
$admin->username=$username; 
$admin->password=$password; 
if($admin->save()>0){ 
   echo "添加成功";  
}else{  
   echo "添加失败";  
}

$userLimit = new UserLimit();
$userLimit->item = 0.30000;
if($userLimit->insert(){

}


======================================== 五、修改的方法 


$userLimitRet = UserLimit::model()->findByPk(array (
                                ‘user_id‘ => $userId, 
                                ‘category_id‘ => $v 
                        ));
$userLimitRet->order = $order;

if (! $userLimitRet->update()) {
} 
$userAmount=userAmount::model()->findByPk($userId);
$userAmount->credit=Yii::app()->request->getParam(‘credit‘,10000);
$ret = $userAmount->save();


1、Post::model()->updateAll($attributes,$condition,$params);
 $count =Admin::model()->updateAll(array(‘username‘=>‘11111‘,‘password‘=>‘11111‘),‘password=:pass‘,array(‘:pass‘=>‘1111a1‘));
if($count>0){  
   echo "修改成功";  
}else{  
   echo "修改失败";  
} 

 

 

 

 

 

$ret = $this->updateAll(array (
                                ‘set‘ => $Set
                        ), " user_id in ( " . $userIds . " )and category_id = " . $categoryId);

if($ret){
    return true;
}else {
    return false;
}

 

 


 2、Post::model()->updateByPk($pk,$attributes,$condition,$params);
 $count =Admin::model()->updateByPk(1,array(‘username‘=>‘admin‘,‘password‘=>‘admin‘));
$count =Admin::model()->updateByPk(array(1,2),array(‘username‘=>‘admin‘,‘password‘=>‘admin‘),‘username=:name‘,array(‘:name‘=>‘admin‘));
if($count>0){  
   echo "修改成功";  
}else{  
   echo "修改失败";  
}  
$pk代表主键,可以是一个也可以是一个集合,$attributes代表是要修改的字段的集合,$condition代表条件,$params传入的值


 3、Post::model()->updateCounters($counters,$condition,$params);
 $count=Admin::model()->updateCounters(array(‘status‘=>1),‘username=:name‘,array(‘:name‘=>‘admin‘));
if($count>0){  
   echo "修改成功";  
}else{  
   echo "修改失败";  
}  
array(‘status‘=>1)代表数据库中的admin表根据条件username=‘admin‘,查询出的所有结果status字段都自加1 
 
======================================== 六、删除的方法  
1、Post::model()->deleteAll($condition,$params); 
 $count = Admin::model()->deleteAll(‘username=:nameandpassword=:pass‘,array(‘:name‘=>‘admin‘,‘:pass‘=>‘admin‘));
         $id=1,2,3  
         deleteAll(‘id in(".$id.")‘);删除id为这些的数据 
if($count>0){  
   echo "删除成功";  
}else{  
   echo "删除失败";  
}  
 2、Post::model()->deleteByPk($pk,$condition,$params); 
$count = Admin::model()->deleteByPk(1); 
$count =Admin::model()->deleteByPk(array(1,2),‘username=:name‘,array(‘:name‘=>‘admin‘));
if($count>0){  
   echo "删除成功";  
}else{  
   echo "删除失败";  
}


————————————————————————————————————
创建 create

例:// insert into table values($name, $mail);

execute  //return 被影响的行数  *可执行 insert update delete
Yii::app()->db->createCommand("insert into table values($name, $mail)")->execute();   

save    //return booler
$model = new Post(); $model->field=$param;$model->save();   

insert   //return booler
 Yii::app()->db->createCommand()->insert(‘table‘, array(‘name‘=>‘Tester‘, ‘email‘=>‘tester@example.com‘,));   


删除 delete

例://delete from table where user=$id;
execute   //return 被删除的行数  *可执行 insert update delete
Yii::app()->db->createCommand("delete from table where user=$id")->execute();   

delete    //return 被删除的行数
Yii::app()->db->createCommand()->delete("table","user=:id",array(":id"=>$user));   

 delete    //return booler
$model = Post::model()->findByPk(1); $model->delete();   

deleteAll   //return 被删除的行数
Post::model()->deleteAll("user=:id",array(":id"=>$id));    

deleteAllByAttributes    //return 被删除的行数
Post::model()->deleteAllByAttributes(array("user"=>$id),"name=:name",array(":name"=>$name));    

deleteByPk    //return 被删除的行数   *pk(array(1,2)) 
Post::model()->deleteByPk($id,"name=:name",array(":name"=>$name));    


更新 update

例://updae table set name=$name where user=$id;

execute   //return 被更新的行数  *可执行 insert update delete
Yii::app()->db->createCommand("updae table set name=$name where user=$id")->execute();  
save     //return booler 
$model = Post::model()->findByPk($id); $ model->name=$name;$model->save();  
updateAll   //return 被更新的行数
 Post::model()->updateAll(array("name"=>$name),"user=:id",array(":id"=>$id));    

updateByPk      //return 被更新的行数

Post::model()->updateByPk($id,array("name"=>$name),$condition,array(":param"=>$param));   
updateCount     //return 被更新的行数
Post::model()->updateCounters(array("一般是计数器“=>1),"user=:id",array(":id"=>$id));     



读取 read

例://select * from table where user=$id and name=$name

find    //return  record or null
Post::model()->find("user=:id  and  name=:name",array(":id"=>$id,":name"=$name));

findAll    //return  array()
Post::model()->findAll("user=:id  and  name=:name",array(":id"=>$id,":name"=$name));
findByAttributes     //return  record or null
Post::model()->findByAttributes(array("name"=>$name),"user=:id",array(":id"=>$id))
findAllByAttributes    //return   array()
Post::model()->findAllByAttributes(array("name"=>$name),"user=:id",array(":id"=>$id));

findByPK    //return  record or null
Post::model()->findByPk($id,"name=:name",array(":name"=>$name));
findAllByPk    //return array()
Post::model()->findAllByPk($id,"name=:name",array(":name"=>$name));

findBySql    //return  record or null
Post::model()->findBySql("select * from table where user=? and name=?",array($id,$name);

findAllBySql    //return  record or null
Post::model()->findAllBySql("select * from table where user=? and name=?",array($id,$name);
queryAll    //return  return array()
Yii::app()->db->createCommand("select * from table where user=$id and name=$name")->queryAll();

可以自己试一下
query();      // 查询并返回结果                                  queryRow();       // 查询并返回结果中的第一行    
queryColumn(); // 查询并返回结果中的第一列     queryScalar();  // 查询并返回结果中第一行的第一个字段

——————————————————————————————————————————————
1.数据的”增删改查“通过控制器来完成。


======================================
从表单获得数据,增加数据
  public function actionCreate()
 {
  $model=new Post;
  if(isset($_POST[‘Post‘]))
  {
   $model->attributes=$_POST[‘Post‘];//增加数据
   if($model->save())
    $this->redirect(array(‘view‘,‘id‘=>$model->id));
  }
  $this->render(‘create‘,array(
   ‘model‘=>$model,
  ));
 }

直接使用$_POST[]数组获得数据,提交的方式在视图里自动完成的。

$model->attributes 会自动调用setAttributes()方法将表单里的值赋值给相应的变量(变量名和字段名相同)
=======================================
获得数据表数据
  public function actionIndex()
 {
  $dataProvider=new CActiveDataProvider(‘Post‘);
  $this->render(‘index‘,array(
   ‘dataProvider‘=>$dataProvider,
  ));
 }

使用CActiveDataProvider类来获得数据表的数据,传入AR的类名。
=============================================================
查找数据
  public function loadModel()
 {
  if($this->_model===null)
  {
   if(isset($_GET[‘id‘]))

   //这里的Post是个数据表(表名Post)(模型类)
    $this->_model=Post::model()->findbyPk($_GET[‘id‘]);//一行数据的对象

   if($this->_model===null)
    throw new CHttpException(404,‘The requested page does not exist.‘);
  }
  return $this->_model;
 }

 public function actionView()
 {
  $this->render(‘view‘,array(
   ‘model‘=>$this->loadModel(),
  ));
 }

Post::model()->findbyPk() 是有数据模型提供的查找方法。
URL:?r=post/view&id=1
================================================================
更新数据
  public function actionUpdate()
 {
  $model=$this->loadModel();
  if(isset($_POST[‘Post‘]))
  {
   $model->attributes=$_POST[‘Post‘];
   if($model->save())
    $this->redirect(array(‘view‘,‘id‘=>$model->id));
  }
  $this->render(‘update‘,array(
   ‘model‘=>$model,
  ));
 }

URL:?r=post/update&id=1
==================================================
删除数据
  public function actionDelete()
 {
  if(Yii::app()->request->isPostRequest)
  {
   $this->loadModel()->delete();
   if(!isset($_GET[‘ajax‘]))
    $this->redirect(array(‘index‘));
  }
  else
   throw new CHttpException(400,‘Invalid request. Please do not repeat this request again.‘);
 }


2.来自  关于yii 数据库添加新字段之后model类的修改

rules:

array(‘新字段‘,‘safe‘,‘on‘=>‘search‘)

1、array(‘新字段‘, ‘safe‘)//这个如果是要用户输入的话,要加一下,

2、array(‘新字段‘, ‘numerical‘),//如果是数字的话

3、array(‘新字段‘, ‘length‘, ‘max=>100),//如果是文本

1、2、3适当的最少要加一条,新字段才会被保存。



attributeLabels:

‘新字段‘=>‘新字段‘,//关于显示的label



search:

$criteria->compare(‘新字段‘,$this->新字段,true);//gridview靠的就是这里搜索的。

给个gridview的添加例子:

array(‘name‘=>‘新字段‘,‘filter‘=>$array/*,‘type‘=>‘raw‘//貌似新版的YII不用这项,只要filter是个数组就可以了*/),

————————————————————————————————————————————————————————


Yii AR Model 查询
 Yii AR很好很强大,但刚开始不知道怎么使用

  如果英文不错,可以直接看原文地址http://www.yiiframework.com/doc/guide/1.1/en/database.ar 

 下面是我对AR的一些理解

 对于一个Model Post 有如下的4中查询方法,返回对象或者对象数组。

 // find the first row satisfying the specified condition

复制代码
$post=Post::model()->find($condition,$params);
// find the row with the specified primary key
$post=Post::model()->findByPk($postID,$condition,$params);
// find the row with the specified attribute values
$post=Post::model()->findByAttributes($attributes,$condition,$params);
// find the first row using the specified SQL statement
$post=Post::model()->findBySql($sql,$params);
复制代码
 

假设我们查询postID = 10的数据,怎么查询呢,见下面

 // find the row with postID=10

$post=Post::model()->find(‘postID=:postID‘, array(‘:postID‘=>10));
条件$condition 就是我们sql里的where部分,那参数怎么办呢,通过params传递,不过名字是加了":"的。

 

YII有个CDbCriteria类来构造查询,如果我们查询postId为10的title,CdbCriteria是这样构造的

$criteria=new CDbCriteria;
$criteria->select=‘title‘;  // only select the ‘title‘ column
$criteria->condition=‘postID=:postID‘;
$criteria->params=array(‘:postID‘=>10);
$post=Post::model()->find($criteria); // $params is not needed 

 

 你也可以写成下面这样

$post=Post::model()->find(array(
    ‘select‘=>‘title‘,
    ‘condition‘=>‘postID=:postID‘,
    ‘params‘=>array(‘:postID‘=>10),
)); 

 

findByAttributes 里的

 $attributes就是字段的名字.
 

查询title为abc怎么查询呢?见下面

Post::model()->findByAttributes(array(‘title‘=>‘abc‘))
 

 1、$admin=Admin::model()->findAll($condition,$params);     8 I eE7  

Sw 1z ^`  
该方法是根据一个条件查询一个集合,如: ,@\ $Py J  
findAll("username=:name",array(":name"=>$username));     sJI"m‘r=Z  
)9pRTdT  
`6No6 . \J  
2、$admin=Admin::model()->findAllByPk($postIDs,$condition,$params); zl] Ic‘ _i  
findAllByPk($id,"name like ‘:name‘ and age=:age" ,array(‘:name‘=>$name,‘age‘=>$age));     u5‘jIq lU  
TPBL|^3K  
该方法是根据主键查询一个集合,可以使用多个主键,如: Ye=c;0 V(w  
findAllByPk(array(1,2)); >;sz (F3 )  
         E GL7z`nt  
2lu A F 2  
3、$admin=Admin::model()->findAllByAttributes($attributes,$condition,$params); g7l ?/ p[n  
qS!U 1R?s  
该方法是根据条件查询一个集合,可以是多个条件,把条件放到数组里面,如: E 4cPCQyeH  
findAllByAttributes(array(‘username‘=>‘admin‘)); Q/ %] %d  
bj r( )NM1  
([OD mZHv  
4、$admin=Admin::model()->findAllBySql($sql,$params); O $(#gB‘B  
SH5a&OVZhn  
该方法是根据SQL语句查询一个数组,如: }G ^nK m  
findAllBySql("select *from admin where username=:name",array(‘:name‘=>‘admin‘)); W}P9I &3  
----------------------------------------------------------------------------- l& _Ps nU  
二、查询对像的方法 4Xgz N wm  
1、$admin=Admin::model()->findByPk($postID,$condition,$params); P{2j 31u `  
Zq {TY)PI]  
根据主键查询出一个对象,如:findByPk(1); 3a0% J ‘  
‘3iJ q 9  
2、$row=Admin::model()->find($condition,$params); J Oo+RA5 d  
@}io K=A  
根据一个条件查询出一组数据,可能是多个,但是他只返回第一行数据,如: "h:#‘y $V  
find(‘username=:name‘,array(‘:name‘=>‘admin‘)); h |. {dv  
%& !B2z }  
3、$admin=Admin::model()->findByAttributes($attributes,$condition,$params); B:6VD /qC  
V gO.i n^q  
该方法是根据条件查询一组数据,可以是多个条件,把条件放到数组里面,他查询的也是第一条数据,如: p /gf  
findByAttributes(array(‘username‘=>‘admin‘)); /\ U:F  
6SE q 2  
rSKZc`< ^  
4、$admin=Admin::model()->findBySql($sql,$params); x zBUm  
d_ji ..T  
该方法是根据SQL语句查询一组数据,他查询的也是第一条数据,如: cG 5u $ B  
findBySql("select *from admin where username=:name",array(‘:name‘=>‘admin‘)); gb/<(I )  
a7"Aq:IjU  
5、拼一个获得SQL的方法,在根据find查询出一个对象 AL*M` m _  
$criteria=new CDbCriteria; 4 0 % <E  
$criteria->select=‘username‘;  // only select the ‘title‘ column TiD|.a8 S  
$criteria->condition=‘username=:username‘; d*l2x[8}g-  
$criteria->params=array(‘:username=>‘admin‘); z|O3p Qn~  
$post=Post::model()->find($criteria); // $params is not needed I.ku Y D62  
_J>!KDz  
r+,JM L  
------------------------------------------------------------------------------ R[}fr36>/  
三、查询个数,判断查询是否有结果 K/z2. Npn  
1、$n=Post::model()->count($condition,$params); #&ayW ef  
`+@r 0:G&v  
该方法是根据一个条件查询一个集合有多少条记录,返回一个int型数字,如 4tz@?T C b  
count("username=:name",array(":name"=>$username));    R /l /GNm  
} F. .w/  
2、$n=Post::model()->countBySql($sql,$params); %!]CP1 S  
U3t) yr h  
该方法是根据SQL语句查询一个集合有多少条记录,返回一个int型数字,如 ~LJ t lJ0  
countBySql("select *from admin where username=:name",array(‘:name‘=>‘admin‘)); : b <<  
~{q; - &  
3、$exists=Post::model()->exists($condition,$params); 0r]-Ltvl?}  
[> |6qY$ D  
该方法是根据一个条件查询查询得到的数组有没有数据,如果有数据返回一个true,否则没有找到 ;ApldoMi  
3 #Xv))w 1  
} a!c  
================================================================================================================= T) MZ` dM  
四、添加的方法 -S 0dr8E  
$admin=new Admin;        ` \Te ,  
$admin->username=$username; e V (  
$admin->password=$password; j 9*5K j  
if($admin->save()>0){ =[YjIWr #o  
    echo "添加成功"; "\rR0V! wA  
}else{ y hNy  
    echo "添加失败"; jGtu >|Gj  
} \ 6 : 7  
==================================================================================================================== [*d<LAnuWP  
五、修改的方法 4[ = C,5r  
1、Post::model()->updateAll($attributes,$condition,$params); lBNB8c0e"{  
Ex4)R2c*  
$count = Admin::model()->updateAll(array(‘username‘=>‘11111‘,‘password‘=>‘11111‘),‘password=:pass‘,array(‘:pass‘=>‘1111a1‘)); " eR- (c1  
if($count>0){ VVH L @  
    echo "修改成功"; koy0 A/\%  
}else{ |sn WO0i F  
    echo "修改失败"; V( 3rTDg  
} Fz^5cx mw  
m";?B 1%x  
2、Post::model()->updateByPk($pk,$attributes,$condition,$params); [A#>G 4a<  
R 6 qC0@ *  
$count = Admin::model()->updateByPk(1,array(‘username‘=>‘admin‘,‘password‘=>‘admin‘)); @S?D }myD  
$count = Admin::model()->updateByPk(array(1,2),array(‘username‘=>‘admin‘,‘password‘=>‘admin‘),‘username=:name‘,array(‘:name‘=>‘admin‘)); |e H *Q% M  
if($count>0){ Z ~ H La  
    echo "修改成功"; zmh5x {US1  
}else{ x *0mmlCb  
    echo "修改失败"; J 3A S"+ ]  
} e(U b7 L#  
$pk代表主键,可以是一个也可以是一个集合,$attributes代表是要修改的字段的集合,$condition代表条件,$params传入的值 k"J=CD P\  
L KI2R_ |n  
3、Post::model()->updateCounters($counters,$condition,$params); ~V aO,8&+L  
Y OY{f:ew  
$count =Admin::model()->updateCounters(array(‘status‘=>1),‘username=:name‘,array(‘:name‘=>‘admin‘)); ~ I s-^k)y  
if($count>0){ WU<C 7  
    echo "修改成功"; `KzNB H ,W  
}else{ I CB‘?y Z,  
    echo "修改失败"; zwp g f  
} 0 @ *E w I  
array(‘status‘=>1)代表数据库中的admin表根据条件username=‘admin‘,查询出的所有结果status字段都自加1 T NK~ETE 4  
QR] 61v :`  
================================================================================================================================================ VN! +r7w‘  
六、删除的方法 b\H ! \A  
1、Post::model()->deleteAll($condition,$params); lL{1wCsl  
[_SV $Jz  
$count = Admin::model()->deleteAll(‘username=:name and password=:pass‘,array(‘:name‘=>‘admin‘,‘:pass‘=>‘admin‘)); &H< n 7 6G  
            $id=1,2,3 y %^TZ[S  
            deleteAll(‘id in(".$id.")‘);删除id为这些的数据 eLc@w<yB  
if($count>0){ b `Agb <x"  
    echo "删除成功"; a =" \?L 5  
}else{ _ Y M]U` *  
    echo "删除失败"; +G qV9x 8  
} +S3r]D3 v/  
$6 A91|ZSQ  
2、Post::model()->deleteByPk($pk,$condition,$params); uI*2} Q  
$count = Admin::model()->deleteByPk(1); zu8l2( N  
$count = Admin::model()->deleteByPk(array(1,2),‘username=:name‘,array(‘:name‘=>‘admin‘)); 8a SH0dX  
if($count>0){ F;& a=R!.  
    echo "删除成功"; h5.>};"@   
}else{ w u  
    echo "删除失败"; <hO|:LX  
} qL03iV#h*V  
 t&i t&i
#Php
 

1、$admin=Admin::model()->findAll($condition,$params);     
 
该方法是根据一个条件查询一个集合,如: 
findAll("username=:name",array(":name"=>$username));     
 
 
2、$admin=Admin::model()->findAllByPk($postIDs,$condition,$params); 
findAllByPk($id,"name like ‘:name‘ and age=:age" ,array(‘:name‘=>$name,‘age‘=>$age));     
 
该方法是根据主键查询一个集合,可以使用多个主键,如: 
findAllByPk(array(1,2)); 
         
 
3、$admin=Admin::model()->findAllByAttributes($attributes,$condition,$params); 
 
该方法是根据条件查询一个集合,可以是多个条件,把条件放到数组里面,如: 
findAllByAttributes(array(‘username‘=>‘admin‘)); 
 
 
4、$admin=Admin::model()->findAllBySql($sql,$params); 
 
该方法是根据SQL语句查询一个数组,如: 
findAllBySql("select *from admin where username=:name",array(‘:name‘=>‘admin‘)); 
----------------------------------------------------------------------------- 
二、查询对像的方法 
1、$admin=Admin::model()->findByPk($postID,$condition,$params); 
 
根据主键查询出一个对象,如:findByPk(1); 
 
2、$row=Admin::model()->find($condition,$params); 
 
根据一个条件查询出一组数据,可能是多个,但是他只返回第一行数据,如: 
find(‘username=:name‘,array(‘:name‘=>‘admin‘)); 
 
3、$admin=Admin::model()->findByAttributes($attributes,$condition,$params); 
 
该方法是根据条件查询一组数据,可以是多个条件,把条件放到数组里面,他查询的也是第一条数据,如: 
findByAttributes(array(‘username‘=>‘admin‘)); 
 
 
4、$admin=Admin::model()->findBySql($sql,$params); 
 
该方法是根据SQL语句查询一组数据,他查询的也是第一条数据,如: 
findBySql("select *from admin where username=:name",array(‘:name‘=>‘admin‘)); 
 
5、拼一个获得SQL的方法,在根据find查询出一个对象 
$criteria=new CDbCriteria; 
$criteria->select=‘username‘;  // only select the ‘title‘ column 
$criteria->condition=‘username=:username‘; 
$criteria->params=array(‘:username=>‘admin‘); 
$post=Post::model()->find($criteria); // $params is not needed 
 
 
------------------------------------------------------------------------------ 
三、查询个数,判断查询是否有结果 
1、$n=Post::model()->count($condition,$params); 
 
该方法是根据一个条件查询一个集合有多少条记录,返回一个int型数字,如 
count("username=:name",array(":name"=>$username));     
 
2、$n=Post::model()->countBySql($sql,$params); 
 
该方法是根据SQL语句查询一个集合有多少条记录,返回一个int型数字,如 
countBySql("select *from admin where username=:name",array(‘:name‘=>‘admin‘)); 
 
3、$exists=Post::model()->exists($condition,$params); 
 
该方法是根据一个条件查询查询得到的数组有没有数据,如果有数据返回一个true,否则没有找到 
 
 
================================================================================================================= 
四、添加的方法 
$admin=new Admin;         
$admin->username=$username; 
$admin->password=$password; 
if($admin->save()>0){ 
    echo "添加成功"; 
}else{ 
    echo "添加失败"; 
} 
==================================================================================================================== 
五、修改的方法 
1、Post::model()->updateAll($attributes,$condition,$params); 
 
$count = Admin::model()->updateAll(array(‘username‘=>‘11111‘,‘password‘=>‘11111‘),‘password=:pass‘,array(‘:pass‘=>‘1111a1‘)); 
if($count>0){ 
    echo "修改成功"; 
}else{ 
    echo "修改失败"; 
} 
 
2、Post::model()->updateByPk($pk,$attributes,$condition,$params); 
 
$count = Admin::model()->updateByPk(1,array(‘username‘=>‘admin‘,‘password‘=>‘admin‘)); 
$count = Admin::model()->updateByPk(array(1,2),array(‘username‘=>‘admin‘,‘password‘=>‘admin‘),‘username=:name‘,array(‘:name‘=>‘admin‘)); 
if($count>0){ 
    echo "修改成功"; 
}else{ 
    echo "修改失败"; 
} 
$pk代表主键,可以是一个也可以是一个集合,$attributes代表是要修改的字段的集合,$condition代表条件,$params传入的值 
 
3、Post::model()->updateCounters($counters,$condition,$params); 
 
$count =Admin::model()->updateCounters(array(‘status‘=>1),‘username=:name‘,array(‘:name‘=>‘admin‘)); 
if($count>0){ 
    echo "修改成功"; 
}else{ 
    echo "修改失败"; 
} 
array(‘status‘=>1)代表数据库中的admin表根据条件username=‘admin‘,查询出的所有结果status字段都自加1 
 
================================================================================================================================================ 
六、删除的方法 
1、Post::model()->deleteAll($condition,$params); 
 
$count = Admin::model()->deleteAll(‘username=:name and password=:pass‘,array(‘:name‘=>‘admin‘,‘:pass‘=>‘admin‘)); 
            $id=1,2,3 
            deleteAll(‘id in(".$id.")‘);删除id为这些的数据 
if($count>0){ 
    echo "删除成功"; 
}else{ 
    echo "删除失败"; 
} 
 
2、Post::model()->deleteByPk($pk,$condition,$params); 
$count = Admin::model()->deleteByPk(1); 
$count = Admin::model()->deleteByPk(array(1,2),‘username=:name‘,array(‘:name‘=>‘admin‘)); 
if($count>0){ 
    echo "删除成功"; 
}else{ 
    echo "删除失败"; 
} 

___________________________________________________________________________________________________

使用Yii开发 Find操作  


|字号 订阅

Yii里的ORM使用的是AR, 有几个主要的操作, 分别是:

save - 操作数据update - 修改数据delete - 删除数据validate - 验证数据
读取记录时, 有以下几个方法:

findByPk - 通过主键查找记录, 结果为单条记录findByAttribute - 通过属性查找记录, 结果为单条记录findAllByAttributes - 通过属性查找数据, 结果为记录集findAll- 通过CDbCriteria对象查找数据, 结果为记录集 *
查找方法接收的参数有2种, 没有星号的, 接受数组作为参数, 有星号的接收CDbCriteria对象作为参数, 使用对象的时候, 可以提供更多的查找条件, 下面给出一个实例:

$criteria = new CDbCriteria; // 创建CDbCriteria对象$criteria->condition = ‘title LIKE %‘ . ‘php‘ . ‘%‘; // 设置查询条件$criteria->order =‘createdTime DESC‘; // 设置排序条件$criteria->limit = 10; // 限定记录的条数$criteria->select = ‘id,title,content‘; // 设置结果所包含的字段$articles = Article::model()->findAll($criteria); //结果为数组, 其中每个元素为记录对象
再次, Yii对关联数据默认采用LazyLoad的加载形式, 即需要时才读取. 这样, 当我们不需要关联数据的时候, Yii是不会帮我们去读取的, 大大加快了反应的速度. 但是也有一些时候, 我们是需要关联数据的, 比如说读取文章的时候, 我们是需要文章所属的分类的, 如果使用LazyLoad的形式, 就要有多少条, 查询多少次, 效率非常低下, 这时就需要EagerLoad了, 即一次把关联表的数据全部读出. 比如:

$articles = Article::model()->with(‘category‘)->findAll();
使用with将关联表的数据一次全部读出. 关联表的设置在

Model

里的relation里设置. 比如:

publicfunction relations() {        returnarray(              ‘category‘ => array(self::BELONGS_TO, ‘Category‘, ‘categoryId‘),         ); }
————————————————————————————————————————————————————
YII AR的findAll结果集转换成json数据格式
从1.0.2版本开始CActiveRecord已经支持JSON编码了。只要用CJSON::encode($models)就可以得到你想要的结果了。参见:http://code.google.com/p/yii/issues/detail?id=104&can=1&q=json

.
$list
 = Game::model()->findAll();
$json
 = CJSON::encode($list);
.
 yii 用findAll获取的数据对像转换成数组
[php] view plaincopyprint?
$model->album = 2;//设置默认选中值  
//print_r(Album::model()->findAll());  
echo CHtml::activeDropDownList($model, ‘album‘, CHtml::listData(Album::model()->findAll(), ‘id‘, ‘title‘), NULL, ‘2‘);
——————————————————————————————————————————————————
Yii查看调试信息里的SQL语句  
Yii的参数配置里面可以设置调试信息(不仅包括SQL语句),在/yiiroot/protected/config/main.php中配置:
log=>array(
            class‘=>‘CLogRouter‘,
            ‘routes‘=>array(
                array(
                    class‘=>‘CFileLogRoute‘,
                    ‘levels‘=>‘error, warning‘,
                ),
                // uncomment the following to show log messages on web pages
                ///*
                array(
                    class‘ => ‘CWebLogRoute‘,
                    ‘levels‘ => ‘profile,trace‘,
                ),
                array(
                    class‘ => ‘CProfileLogRoute‘,
                    ‘levels‘ => ‘profile‘,
                ),
                //*/
            ),
        ),
————————————————————————————————————————————————————————————
CDbCriteria 详细便用说明
第一部分:
yii的CDbCriteria已经更强大了,但是也有时候不能满足我们,这个时候我们必须要自行写SQL语句,下面这种方法,非常不错,以获取fe_category表数据为例:

1
2
3
4
5
6
7
8
9
10
//
 获取所有分类
public function getAllCategoryName()
 {
    $allCategoryName =
 Category::model()->findAll();
    return CHtml::listData($allCategoryName,‘id‘,‘name‘);
                    
    //下面是用来验证的代码
    //$returnData
 = http://www.mamicode.com/CHtml::listData($allCategoryName,‘id‘,‘name‘);
    //print_r($returnData);
    //exit;
}
等价于:

1
2
3
4
5
6
7
8
9
10
//
 获取所有分类
public function getAllCategoryName()
 {
    $allCategoryName = 
 Category::model()->findAllBySql("SELECT
 * FROM  `fe_category` ");
    return CHtml::listData($allCategoryName,‘id‘,‘name‘);
                
    //下面是用来验证的代码
    //$returnData
 = http://www.mamicode.com/CHtml::listData($allCategoryName,‘id‘,‘name‘);
    //print_r($returnData);
    //exit;
}

第二部分:
Yii的Active Recorder包装了很多。
特别是把SQL中 把where,order,limit,IN/not IN,like等常用短句都包含进CDbCriteria这个类中去
这样整个代码会比较规范,一目了然。
   $criteria =newCDbCriteria; 

 $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);//between1 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 offset1,或者代表了。limit 1,10     $criteria->order = ‘xxx DESC,XXX ASC‘ ;//排序条件    $criteria->group = ‘group 条件‘;    $criteria->having = ‘having 条件 ‘;    $criteria->distinct = FALSE;//是否唯一查询

——————————————————————————————————————————


AR模式中的增删查改操作示例如下:
一、查询数据集合
1、$admin=Admin::model()->findAll($condition,$params);
     该方法是根据一个条件查询一个集合,如:  
     findAll("username=:name",array(":name"=>$username));     
2、$admin=Admin::model()->findAllByPk($postIDs,$condition,$params); 
     findAllByPk($id,"name like ‘:name‘ and age=:age",array(‘:name‘=>$name,‘age‘=>$age));   
     该方法是根据主键查询一个集合,可以使用多个主键,如:  
     findAllByPk(array(1,2));    
3、$admin=Admin::model()->findAllByAttributes($attributes,$condition,$params); 
     该方法是根据条件查询一个集合,可以是多个条件,把条件放到数组里面,如:  
     findAllByAttributes(array(‘username‘=>‘admin‘)); 
4、$admin=Admin::model()->findAllBySql($sql,$params); 
    该方法是根据SQL语句查询一个数组,如: 
    findAllBySql("select *from admin whereusername=:name",array(‘:name‘=>‘admin‘)); 

二、查询对像的方法  

1、$admin=Admin::model()->findByPk($postID,$condition,$params); 
    根据主键查询出一个对象,如:findByPk(1);  
 2、$row=Admin::model()->find($condition,$params); 
    根据一个条件查询出一组数据,可能是多个,但是他只返回第一行数据,如: 
    find(‘username=:name‘,array(‘:name‘=>‘admin‘)); 
 3、$admin=Admin::model()->findByAttributes($attributes,$condition,$params); 
    该方法是根据条件查询一组数据,可以是多个条件,把条件放到数组里面,他查询的也是第一条数据,如: 
    findByAttributes(array(‘username‘=>‘admin‘)); 
 4、$admin=Admin::model()->findBySql($sql,$params); 
      该方法是根据SQL语句查询一组数据,他查询的也是第一条数据,如:  
      findBySql("select *from admin whereusername=:name",array(‘:name‘=>‘admin‘)); 
 5、拼一个获得SQL的方法,在根据find查询出一个对象  
     $criteria=new CDbCriteria;  
     $criteria->select=‘username‘; // only select the ‘title‘ column  
     $criteria->condition=‘username=:username‘; 
     $criteria->params=array(‘:username=>‘admin‘); 
     $post=Post::model()->find($criteria); // $params isnot needed  
 
三、查询个数,判断查询是否有结果  

1、$n=Post::model()->count($condition,$params); 
     该方法是根据一个条件查询一个集合有多少条记录,返回一个int型数字,count("username=:name",array(":name"=>$username));    
 2、$n=Post::model()->countBySql($sql,$params); 
      该方法是根据SQL语句查询一个集合有多少条记录,返回一个int型数字,如 
      countBySql("select *from admin whereusername=:name",array(‘:name‘=>‘admin‘)); 
 3、$exists=Post::model()->exists($condition,$params); 
      该方法是根据一个条件查询查询得到的数组有没有数据,如果有数据返回一个true,否则没有找到 

四、添加的方法  
      $admin=new Admin;        
      $admin->username=$username; 
      $admin->password=$password; 
     if($admin->save()>0){ 
         echo "添加成功";  
     }else{  
         echo "添加失败";  
    }  

五、修改的方法  
1、Post::model()->updateAll($attributes,$condition,$params); 
 $count=Admin::model()->updateAll(array(‘username‘=>‘11111‘,‘password‘=>‘11111‘),‘password=:pass‘,array(‘:pass‘=>‘1111a1‘)); 
  2、Post::model()->updateByPk($pk,$attributes,$condition,$params); 
 $count =Admin::model()->updateByPk(1,array(‘username‘=>‘admin‘,‘password‘=>‘admin‘)); 
 $count=Admin::model()->updateByPk(array(1,2),array(‘username‘=>‘admin‘,‘password‘=>‘admin‘),‘username=:name‘,array(‘:name‘=>‘admin‘)); 
  $pk代表主键,可以是一个也可以是一个集合,$attributes代表是要修改的字段的集合$condition代表条件$params传入的值 
 3、Post::model()->updateCounters($counters,$condition,$params); 
   $count=Admin::model()->updateCounters(array(‘status‘=>1),‘username=:name‘,array(‘:name‘=>‘admin‘)); 
   array(‘status‘=>1)代表数据库中的admin表根据条件username=‘admin‘,查询出的所有结果status字段都自加1 
 
六、删除的方法  
1、Post::model()->deleteAll($condition,$params); 
    $count = Admin::model()->deleteAll(‘username=:nameandpassword=:pass‘,array(‘:name‘=>‘admin‘,‘:pass‘=>‘admin‘)); 
    $id=1,2,3  
     deleteAll(‘id in(".$id.")‘);删除id为这些的数据 

 2、Post::model()->deleteByPk($pk,$condition,$params); 
      $count = Admin::model()->deleteByPk(1); 
      $count =Admin::model()->deleteByPk(array(1,2),‘username=:name‘,array(‘:name‘=>‘admin‘)); 

——————————————————————————————————————————————————————————————————


yii的增删改查  


增:
1 第一种
$post=new Post;
$post->title=‘sample post‘;
$post->content=‘content for the sample post‘;
$post->createTime=time();/$post->createTime=new CDbexpression_r(‘NOW()‘);
$post->save();
 
$user_field_data= new user_field_data;
$user_field_data->flag=0;
$user_field_data->user_id=$profile->id;
$user_field_data->field_id=$_POST[‘emailhiden‘];
$user_field_data->value1=$_POST[‘email‘];
$user_field_data->save();
注当一个表存储4次的时候,需要创建4个handle new4次
2 第二种

存储后我们需要找到这条记录的流水id 这样做 $profile = new profile; $profile->id;

3 第三种

用于更加安全的方法,来绑定变量类型 这样可以在同一个表中存储两个记录

$sql="insert into user_field_data(user_id,field_id,flag,value1) values(:user_id,:field_id,:flag,:value1);";
$command=user_field_data::model()->dbConnection->createCommand($sql);
$command->bindParam(":user_id",$profile->id,PDO::PARAM_INT);
$command->bindParam(":field_id",$_POST[‘firstnamehiden‘],PDO::PARAM_INT);
$command->bindParam(":flag",$tmpflag,PDO::PARAM_INT);
$command->bindParam(":value1",$_POST[‘firstname‘],PDO::PARAM_STR);
$command->execute();
$command->bindParam(":user_id",$profile->id,PDO::PARAM_INT);
$command->bindParam(":field_id",$_POST[‘emailhiden‘],PDO::PARAM_INT);
$command->bindParam(":flag",$tmpflag,PDO::PARAM_INT);
$command->bindParam(":value1",$_POST[‘email‘],PDO::PARAM_STR);
$rowchange = $command->execute();
 
if( $rowchange != 0){ 修改成功 }// 用来判断
//注:update delete都可以用这个方法
$sql="delete from profile where id=:id";
$command=profile::model()->dbConnection->createCommand($sql);
$command->bindParam(":id",$userid,PDO::PARAM_INT);
$this->rowflag=$command->execute();
 
$sql="update profile set pass=:pass,role=:role where id=:id";
$command=profile::model()->dbConnection->createCommand($sql);
$command->bindParam(":pass",$password,PDO::PARAM_STR);
$command->bindParam(":role",$role,PDO::PARAM_INT);
$command->bindParam(":id",$userid,PDO::PARAM_INT);
$this->rowflag=$command->execute();
// 同理变更updateAll()模式
$sql="update user_field_data set flag = :flag where user_id= :user_id and field_id= :field_id ";
原始sql语句
$criteria = new CDbCriteria;
$criteria->condition = ‘user_id = :user_id and field_id= :field_id‘;
$criteria->params = array(‘:user_id‘ => $userid,‘:field_id‘ => $fieldid);
$arrupdate = array(‘flag‘ => $flag);
if(user_field_data::model()->updateAll($arrupdate,$criteria) != 0)
{
更新成功后。。。
}
4 第四种

更新和存储应用同一个handle 流程:先查询记录是否存在,若存在就更新,不存在就新创建
注:1. 第一次查询的变量,要跟save()前的变量一致。2. 存储时候需要再次 new一下库对象

$user_field_data = user_field_data::model()->findByAttributes(
$attributes = array(‘user_id‘ => Yii::app()->user->user_id, ‘field_id‘ => $key));
if ($user_field_data !== null)
{
    $user_field_data->value1 = $value;
    $user_field_data->save();
}
else
{
    $user_field_data = new user_field_data;
    $user_field_data->user_id = Yii::app()->user->user_id;
    $user_field_data->field_id = $key;
    $user_field_data->value1 = $value;
    $user_field_data->save();
}

删:
$post=Post::model()->findByPk(10); // assuming there is a post whose ID is 10
$post->delete(); // delete the row from the database table
// delete the rows matching the specified condition
Post::model()->deleteAll($condition,$params);
// delete the rows matching the specified condition and primary key(s)
Post::model()->deleteByPk($pk,$condition,$params);

改:
例子:
$post=Post::model()->findByPk(10);
$post->title=’new post title’;
$post->save(); // save the change to database

// update the rows matching the specified condition
Post::model()->updateAll($attributes,$condition,$params);
例子:或者参考上面例子
$c=new CDbCriteria;
$c->condition=’something=1′;
$c->limit=10;
$a=array(‘name’=>’NewName’);
Post::model()->updateAll($a, $c);

// update the rows matching the specified condition and primary key(s)
Post::model()->updateByPk($pk,$attributes,$condition,$params);
例子
$profile = profile::model()->updateByPk(
Yii::app()->user->user_id,
$attributes = array(‘pass’ => md5($_POST[‘password‘]), ‘role’ => 1));

// update counter columns in the rows satisfying the specified conditions
Post::model()->updateCounters($counters,$condition,$params);

查:
注:当项目没查找到整个对象会为空需要这样判定
if($rows !== null) 当对象不为空
{
    return true;
}else{
    return false;
}
SELECT,读表时候用到
find()
第一种find()
// find the first row satisfying the specified condition
$post=Post::model()->find($condition,$params);
// 条件查询
$post = Post::model()->find(‘post_id=:post_id AND status=:status‘,
array(
  ‘:post_id‘=>8,
  ‘:status‘=>‘active‘,
));
同样的语句,用另种方式表示
$criteria=new CDbCriteria;
$criteria->select=‘title‘;  // only select the ‘title‘ column
$criteria->condition=‘postID=:postID‘;
$criteria->params=array(‘:postID‘=>10);
$post=Post::model()->find($criteria); // $params is not needed
第二种find()
$post=Post::model()->find(array(
    ‘select‘=>‘title‘,
    ‘condition‘=>‘postID=:postID‘,
    ‘params‘=>array(‘:postID‘=>10),
));
// find the row with the specified primary key
$post=Post::model()->findByPk($postID,$condition,$params);

findByAttributes()
$post=Post::model()->findByAttributes($attributes,$condition,$params);
第一种findByAttributes()
$checkuser = user_field_data::model()->findByAttributes(
第二种findByAttributes()

_________________________________________________________________________________________________

yii增删改查与sql语句原型的比较:

查找:
select * from UserRelation where userid = $userid;
$userRelation = UserRelation::model()->find("userId=‘{$usersId}‘");

————————————————————————————————————————————————


数据模型搜索方法:
[html] view plaincopyprint? 
public function search()  
{  
    // Warning: Please modify the following code to remove attributes that  
    // should not be searched.  
  
    $criteria=new CDbCriteria;  
  
    $criteria->compare(‘id‘,$this->id);  
    $criteria->compare(‘title‘,$this->title,true);                //支持模糊查找  
    $criteria->compare(‘content‘,$this->content,true);            //支持模糊查找  
    $criteria->compare(‘type‘,$this->type);  
    $criteria->compare(‘user‘,$this->user,true);              //支持模糊查找  
    $criteria->compare(‘status‘,$this->status);  
    $criteria->compare(‘create_data‘,$this->create_data,true);    //支持模糊查找  
  
    return new CActiveDataProvider($this, array(  
        ‘criteria‘=>$criteria,  
        ‘pagination‘=>array(  
            ‘pageSize‘=>50,  
        ),  
    ));  
}  

定义比较运算
[html] view plaincopyprint? 
$criteria->compare(‘create_time‘,‘<=‘.$this->endtime),//创建早间小于等于指定时间  
定义要查找的字段
[html] view plaincopyprint? 
//查找的结果   
$criteria->select = ‘id,title,content,author,status,createtime‘,  
//也可以以下一种方式定义  
$criteria->select = array(‘id‘,‘title‘,‘content‘,‘author‘,‘status‘,‘createtime‘),  

定义填加查找条件
[html] view plaincopyprint? 
//定义条件    
$criteria->select =  ‘status=1‘,  
//添加匹配  
$criteria->compare(‘title‘,$this->title,true),  
//添加条件 $condition可以是数组,也可以是字符串,and可以省略  
$criteria->addCondition($condition,‘and‘),  
//添加IN条件 $column为字段名  
$criteria->addInCondition(string $column, array $values, string $operator=‘AND‘)  
//添加notin条件  
$criteria->addNotInCondition(string $column, array $values, string $operator=‘AND‘)  
//添加like条件  
$criteria->addSearchCondition(string $column, string $keyword),  
//添加Between条件  
$criteria->addBetweenCondition(string $column, string $valueStart, string $valueEnd, string $operator=‘AND‘),  
JOIN连表查询
[html] view plaincopyprint? 
$criteria->join = ‘LEFT JOIN users ON users.id=authorID‘,  

order查询结果排序
[html] view plaincopyprint? 
$criteria->order = ‘createtime DESC‘,  

group结果分组
[html] view plaincopyprint? 
$criteria->group =  ‘projectID, teamID‘,  

having筛选分组结果分组数量
[html] view plaincopyprint? 
$criteria->having =  ‘SUM(revenue)<50000‘,  



资讯显示

在我们的资讯应用中,一篇资讯可以显示在一个列表中,也可以单独显示。前者的实现通过 index 操作,而后者是通过 view 操作。 在这一节中,我们将自定义这两个操作来适合我们一开始的需求。

自定义 view 操作
view 操作是通过 PostController 中的 actionView() 方法实现的。它的显示是通过 view 视图文件 /wwwroot/cms/protected/views/post/view.php 生成的。

下面是在 PostController 中实现 view 操作的具体代码:

public function actionView()
{
    $post=$this->loadModel();
    $this->render(‘view‘,array(
        ‘model‘=>$post,
    ));
}
 
private $_model;
 
public function loadModel()
{
    if($this->_model===null)
    {
        if(isset($_GET[‘id‘]))
        {
            if(Yii::app()->user->isGuest)
                $condition=‘status=‘.Post::STATUS_PUBLISHED
                    .‘ OR status=‘.Post::STATUS_ARCHIVED;
            else
                $condition=‘‘;
            $this->_model=Post::model()->findByPk($_GET[‘id‘], $condition);
        }
        if($this->_model===null)
            throw new CHttpException(404,‘The requested page does not exist.‘);
    }
    return $this->_model;
}
我们的修改主要是在 loadModel() 方法上进行的。在这个方法中,我们通过 id GET参数查询了 Post 表。如果日志未找到或者没有发布,也未存档(当用户为游客(guest)时),我们将抛出一个 404 HTTP 错误。否则,资讯对象将返回给 actionView() ,actionView() 又会把资讯对象传递给视图脚本用于显示。


一、查询数据集合1、$admin=Admin::model()->findAll($condition,$params);该方法是根据一个条件查询一个集合,如: findAll(‘username=:name‘,array(‘:name‘=>$username)); 2、$admin=Admin::model()->findAllByPk($postIDs,$condition,$params);
findAllByPk($id,‘name like ‘:name‘ and age=:age‘,array(‘:name‘=>$name,‘age‘=>$age)); 该方法是根据主键查询一个集合,可以使用多个主键,如: findAllByPk(array(1,2)); 3、$admin=Admin::model()->findAllByAttributes($attributes,$condition,$params); 该方法是根据条件查询一个集合,可以是多个条件,把条件放到数组里面,如: findAllByAttributes(array(‘username‘=>‘admin‘)); 4、$admin=Admin::model()->findAllBySql($sql,$params); 该方法是根据SQL语句查询一个数组,如: findAllBySql(‘select *from admin whereusername=:name‘,array(‘:name‘=>‘admin‘)); 二、查询对像的方法 1、$admin=Admin::model()->findByPk($postID,$condition,$params); 根据主键查询出一个对象,如:findByPk(1); 2、$row=Admin::model()->find($condition,$params); 根据一个条件查询出一组数据,可能是多个,但是他只返回第一行数据,如: find(‘username=:name‘,array(‘:name‘=>‘admin‘)); 3、$admin=Admin::model()->findByAttributes($attributes,$condition,$params); 该方法是根据条件查询一组数据,可以是多个条件,把条件放到数组里面,他查询的也是第一条数据,如: findByAttributes(array(‘username‘=>‘admin‘)); 4、$admin=Admin::model()->findBySql($sql,$params); 该方法是根据SQL语句查询一组数据,他查询的也是第一条数据,如: findBySql(‘select *from admin whereusername=:name‘,array(‘:name‘=>‘admin‘)); 5、拼一个获得SQL的方法,在根据find查询出一个对象 $criteria=new CDbCriteria; 
$criteria->select=‘username‘; // only select the ‘title‘ column 
$criteria->condition=‘username=:username‘;
$criteria->params=array(‘:username=>‘admin‘);
$post=Post::model()->find($criteria); // $params isnot needed 三、查询个数,判断查询是否有结果 1、$n=Post::model()->count($condition,$params); 该方法是根据一个条件查询一个集合有多少条记录,返回一个int型数字,如 count(‘username=:name‘,array(‘:name‘=>$username)); 2、$n=Post::model()->countBySql($sql,$params); 该方法是根据SQL语句查询一个集合有多少条记录,返回一个int型数字,如 countBySql(‘select *from admin whereusername=:name‘,array(‘:name‘=>‘admin‘)); 3、$exists=Post::model()->exists($condition,$params); 该方法是根据一个条件查询查询得到的数组有没有数据,如果有数据返回一个true,否则没有找到 四、添加的方法 $admin=newAdmin; 
$admin->username=$username;
$admin->password=$password;
if($admin->save()>0){
echo ‘添加成功‘; 
}else{ 
echo ‘添加失败‘; 
} 五、修改的方法 1、Post::model()->updateAll($attributes,$condition,$params);
$count =Admin::model()->updateAll(array(‘username‘=>‘11111‘,‘password‘=>‘11111‘),‘password=:pass‘,array(‘:pass‘=>‘1111a1‘));
if($count>0){ 
echo ‘修改成功‘; 
}else{ 
echo ‘修改失败‘; 
} 2、Post::model()->updateByPk($pk,$attributes,$condition,$params);
$count =Admin::model()->updateByPk(1,array(‘username‘=>‘admin‘,‘password‘=>‘admin‘));
$count =Admin::model()->updateByPk(array(1,2),array(‘username‘=>‘admin‘,‘password‘=>‘admin‘),‘username=:name‘,array(‘:name‘=>‘admin‘));
if($count>0){ 
echo ‘修改成功‘; 
}else{ 
echo ‘修改失败‘; 
} $pk代表主键,可以是一个也可以是一个集合,$attributes代表是要修改的字段的集合,$condition代表条件,$params传入的值 3、Post::model()->updateCounters($counters,$condition,$params);
$count=Admin::model()->updateCounters(array(‘status‘=>1),‘username=:name‘,array(‘:name‘=>‘admin‘));
if($count>0){ 
echo ‘修改成功‘; 
}else{ 
echo ‘修改失败‘; 
} array(‘status‘=>1)代表数据库中的admin表根据条件username=‘admin‘,查询出的所有结果status字段都自加1 六、删除的方法 1、Post::model()->deleteAll($condition,$params);
$count = Admin::model()->deleteAll(‘username=:nameandpassword=:pass‘,array(‘:name‘=>‘admin‘,‘:pass‘=>‘admin‘));
$id=1,2,3 
deleteAll(‘id in(‘.$id.‘)‘);删除id为这些的数据
if($count>0){ 
echo ‘删除成功‘; 
}else{ 
echo ‘删除失败‘; 
} 2、Post::model()->deleteByPk($pk,$condition,$params);
$count = Admin::model()->deleteByPk(1);
$count =Admin::model()->deleteByPk(array(1,2),‘username=:name‘,array(‘:name‘=>‘admin‘));
if($count>0){ 
echo ‘删除成功‘; 
}else{ 
echo ‘删除失败‘; 
}