//执行SQL语句需要CDbCommand对象,而该对象由CdbConnection::createCommand()返回,因此: $connection=Yii::app()->db; $command=$connection->createCommand($sql); // 如果SQL语句想要完全有自己写,可以这样: $newSQL = ‘SQL语句‘; $command->text=$newSQL; // CDbCommand对象有两个方法execute()用于非查询SQL执行,而query(),通俗的讲就是用于SELECT查询 // execute()返回的是INSERT, UPDATE and DELETE操作受影响的记录行数 // query()返回一个CDbDataReader对象,使用CDbDataReader对象可以遍历匹配结果集中的所有记录。 $rowCount=$command->execute(); // execute the non-query SQL $dataReader=$command->query(); // execute a query SQL // 返回CDbDataReader对像 $rows=$command->queryAll(); // query and return all rows of result $row=$command->queryRow(); // query and return the first row of result $column=$command->queryColumn(); // query and return the first column of result $value=$command->queryScalar(); // query and return the first field in the first row
// 如果查找的是多行记录可以使用 findAll() findAllByPk() findAllByAttributes() findAllBySql() // find all rows satisfying the specified condition $posts=Post::model()->findAll($condition,$params); // find all rows with the specified primary keys $posts=Post::model()->findAllByPk($postIDs,$condition,$params); // find all rows with the specified attribute values $posts=Post::model()->findAllByAttributes($attributes,$condition,$params); // find all rows using the specified SQL statement $posts=Post::model()->findAllBySql($sql,$params); // 如果没有匹配的行,将返回一个空数组,这可以用empty()去检测
// 另外的一些可以使用的方法: // 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);
// 使用AR更新记录 // 一个典型的实例: $post=Post::model()->findByPk(10); $post->title=‘new post title‘; $post->save(); // save the change to database // 怎么知道这是一条新纪录还是一条旧的记录呢?使用如下方法: if( CActiveRecord::isNewRecord ) // update the rows matching the specified condition Post::model()->updateAll($attributes,$condition,$params); // update the rows matching the specified condition and primary key(s) Post::model()->updateByPk($pk,$attributes,$condition,$params); // update counter columns in the rows satisfying the specified conditions Post::model()->updateCounters($counters,$condition,$params);
// 删除记录 $post=Post::model()->findByPk(10); // assuming there is a post whose ID is 10 $post->delete(); // delete the row from the database table // 注意,当删除记录之后,$post仍然可用, 且保留了原始数据。 // 类级别的方法 // 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);
// 执行关系查询 1).lazy loading approach 懒惰关系执行 // retrieve the post whose ID is 10 $post=Post::model()->findByPk(10); // retrieve the post‘s author: a relational query will be performed here $author=$post->author; // 如果先前没有执行过,现在才执行这个关系查询(事情拖到这一步才做,真的是很懒啊!)
// 如果关系查询执行后没有匹配的结果,返回将会是NULL或空的数组。
2).eager loading approach 热心的关系查询 //这名字真的很萌! // 也就是说一次性取回所有你想要的记录。管你要不要,这这这,太热心了吧! $posts=Post::model()->with(‘author‘)->findAll(); // SQL => ‘SELECT tbl_post.*, author.* FROM tbl_post t INNER JOIN tbl_user author ON t.author = tbl_user.id‘
$posts=Post::model()->with(‘author‘,‘categories‘)->findAll(); // SQL => ‘SELECT * FROM tbl_post t INNER JOIN tbl_user u ON t.author = u.id INNER JOIN categories c ON t.id = c.post_id‘