转载自:http://www.yiichina.org/forum/thread-218-1-1.html

这里提供一些yii的方法解析,希望能够对新手有一点帮助:

1.  存取数据库方法
存储第一种(SAVE )
   存表时候用到  
   例子:

  • $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次
  • 复制代码

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

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

  •    $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)
  •         {
  •            //更新成功后。。。
  •          }
  • 复制代码

    第四种更新和存储应用同一个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();
  •                     }
  • 复制代码

    2、查询数据
       注:当项目没查找到整个对象会为空需要这样判定
           if($rows !== null) 当对象不为空
               {
                     return true;
               }else{
                     return false;
               } 
          
       
       SELECT
       读表时候用到
      第一种find()

  • // find the first row satisfying the specified condition
  •    $post=Post::model()->find($condition,$params);
  •    // find the row with postID=10
  •    $post=Post::model()->find('postID=:postID', array(':postID'=>10));   同样的语句,用另种方式表示
  •    $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);
  •       
  •    // find the row with the specified attribute values
  •    $post=Post::model()->findByAttributes($attributes,$condition,$params);
  • 复制代码

    示例:第一种 findByAttributes()

  • $checkuser = user_field_data::model()->findByAttributes(
  •    array('user_id' => Yii::app()->user->user_id, 'field_id' => $fieldid));
  • 复制代码

    第二种 findByAttributes()

  • $checkuser = user_field_data::model()->findByAttributes(
  •    $attributes = array('user_id' => Yii::app()->user->user_id, 'field_id' => $fieldid));
  • 复制代码

    第三种 当没有conditions时候,不用params

  • $user_field_data = user_field_data::model()->findAllByAttributes(
  •    $attributes = array('user_id' => ':user_id'),
  •    $condition = "field_id in (:fields)",
  •    $params = array(':user_id' => Yii::app()->user->user_id, ':fields' => "$rule->dep_fields"));
  •    
  •    // find the first row using the specified SQL statement
  •    $post=Post::model()->findBySql($sql,$params);
  • 复制代码

    例子
       user_field_data::model()->findBySql("select id from user_field_data where user_id = :user_id and field_id = :field_id ", array(':user_id' => $userid,':field_id'=>$fieldid));
       此时回传的是一个对象
         
       第四种  添加其他条件 
          http://www.yiiframework.com/doc/api/CDbCriteria#limit-detail

  •   $criteria = new CDbCriteria;
  •       $criteria->select ='newtime';  //选择只显示哪几个字段要与库中名字相同,但是不能COUNT(newtime) as name这样写
  •       $criteria->join = 'LEFT JOIN Post ON Post.id=Date.id';
  • 复制代码

    1. 先要在relation函数中增加与Post表的关系语句 
        
           2. Date::model()->with('post')->findAll($criteria)
           $criteria->group  = 'newtime';
           $criteria->limit  = 2; // 都是从0开始,选取几个
           $criteria-> offset = 2;// 从哪个偏移量开始
           print_r(Date::model()->findAll($criteria));
       
       得到行数目或者其他数目 count

  • // get the number of rows satisfying the specified condition
  •    $n=Post::model()->count($condition,$params);
  •    // get the number of rows using the specified SQL statement
  •    $n=Post::model()->countBySql($sql,$params);
  •    // check if there is at least a row satisfying the specified condition
  •    $exists=Post::model()->exists($condition,$params);
  • 复制代码

    3、更新(UPDATE)
       例子:

  • $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);
  •    
  • 复制代码

    4、删除(DELETE)
       例子:

  • $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);
  • 复制代码

    5、比较(COMPARE)
      目前可以取出的

  • 1.  $allquestion=field::model()->findAllBySql("select label from field where step_id = :time1 ", array(':time1' =>1));
  •    
  •    2. 
  •       $criteria=new CDbCriteria;
  •       $criteria->select='label,options';
  •       $criteria->condition='step_id=:postID';
  •       $criteria->params=array(':postID'=>1);
  •       $allquestion=field::model()->findAll($criteria);
  •      $allquestion=field::model()->find("",array("label"));
  • 复制代码

    可以与在models文件夹中的 库连接文件relations()函数合用,这样可以联合查询

  • $criteria=new CDbCriteria;
  •     $criteria->condition='field.step_id=1';
  •     $this->_post=field::model()->with('step')->findAll($criteria);
  • 复制代码

    这样出来的数组里面包含step表中的值,且这个值的条件为 step.id=field.step_id

  •   public function relations()
  •         {
  •                   return array(
  •                                             'step'=>array(self::BELONGS_TO, 'step', 'step_id'),
  •                                        );
  •        }
  • 复制代码

    相关文章: