YII2数据库操作方式汇总

对象操作

查询

  1. //1.简单查询
  2. $admin=Admin::model()->findAll($condition,$params);
  3. $admin=Admin::model()->findAll(“username=:name”,array(“:name”=>$username));
  4. $infoArr= NewsList::model()->findAll(“status = ‘1’ ORDER BY id DESC limit 10 “);
  5. //2. findAllByPk(该方法是根据主键查询一个集合,可以使用多个主键)
  6. $admin=Admin::model()->findAllByPk($postIDs,$condition,$params);
  7. $admin=Admin::model()->findAllByPk($id,”name like :name and age=:age”,array(‘:name’=>$name,’age’=>$age));
  8. $admin=Admin::model()->findAllByPk(array(1,2));
  9. //3.findAllByAttributes (该方法是根据条件查询一个集合,可以是多个条件,把条件放到数组里面)
  10. $admin=Admin::model()->findAllByAttributes($attributes,$condition,$params);
  11. $admin=Admin::model()->findAllByAttributes(array(‘username’=>’admin’));
  12. //4.findAllBySql (该方法是根据SQL语句查询一个数组)
  13. $admin=Admin::model()->findAllBySql($sql,$params);
  14. $admin=Admin::model()->findAllBySql(“select * from admin where username like :name”,array(‘:name’=>’%ad%’));
  15. User::find()->all();    此方法返回所有数据;
  16. User::findOne($id);   此方法返回 主键 id=1  的一条数据(举个例子);
  17. User::find()->where([‘name’ => ‘小伙儿’])->one();   此方法返回 [‘name’ => ‘小伙儿’] 的一条数据;
  18. User::find()->where([‘name’ => ‘小伙儿’])->all();   此方法返回 [‘name’ => ‘小伙儿’] 的所有数据;
  19. User::find()->orderBy(‘id DESC’)->all();   此方法是排序查询;
  20. User::findBySql(‘SELECT * FROM user’)->all();  此方法是用 sql  语句查询 user 表里面的所有数据;
  21. User::findBySql(‘SELECT * FROM user’)->one();  此方法是用 sql  语句查询 user 表里面的一条数据;
  22. User::find()->andWhere([‘sex’ => ‘男’, ‘age’ => ’24’])->count(‘id’);   统计符合条件的总条数;
  23. User::find()->one();    此方法返回一条数据;
  24. User::find()->all();    此方法返回所有数据;
  25. User::find()->count();    此方法返回记录的数量;
  26. User::find()->average();    此方法返回指定列的平均值;
  27. User::find()->min();    此方法返回指定列的最小值 ;
  28. User::find()->max();    此方法返回指定列的最大值 ;
  29. User::find()->scalar();    此方法返回值的第一行第一列的查询结果;
  30. User::find()->column();    此方法返回查询结果中的第一列的值;
  31. User::find()->exists();    此方法返回一个值指示是否包含查询结果的数据行;
  32. User::find()->batch(10);  每次取 10 条数据
  33. User::find()->each(10);  每次取 10 条数据, 迭代查询
  34. 二、查询对象的方法
  35. //根据主键查询出一个对象,如:findByPk(1);
  36. $admin=Admin::model()->findByPk($postID,$condition,$params);
  37. $admin=Admin::model()->findByPk(1);
  38. //根据一个条件查询出一组数据,可能是多个,但是他只返回第一行数据
  39. $row=Admin::model()->find($condition,$params);
  40. $row=Admin::model()->find(‘username=:name’,array(‘:name’=>’admin’));
  41. //该方法是根据条件查询一组数据,可以是多个条件,把条件放到数组里面,查询的也是第一条数据
  42. $admin=Admin::model()->findByAttributes($attributes,$condition,$params);
  43. $admin=Admin::model()->findByAttributes(array(‘username’=>’admin’));
  44. //该方法是根据SQL语句查询一组数据,他查询的也是第一条数据
  45. $admin=Admin::model()->findBySql($sql,$params);
  46. $admin=Admin::model()->findBySql(“select * from admin where username=:name”,array(‘:name’=>’admin’));
  47. //拼一个获得SQL的方法,在根据find查询出一个对象
  48. $criteria=newCDbCriteria;
  49. $criteria->select=’username’;// only select the ‘title’ column
  50. $criteria->condition=’username=:username’;    //请注意,这是一个查询的条件,且只有一个查询条件.多条件用addCondition
  51. $criteria->params=array(“:username=>’admin'”);
  52. $criteria->order =”id DESC”;
  53. $criteria->limit =”3″;
  54. $post=Post::model()->find($criteria);// $params isnot needed
  55. //多条件查询的语句
  56. $criteria= new CDbCriteria;
  57. $criteria->addCondition(“id=1”);//查询条件,即where id = 1
  58. $criteria->addInCondition(‘id’,array(1,2,3,4,5));//代表where id IN (1,2,3,4,5,);
  59. $criteria->addNotInCondition(‘id’,array(1,2,3,4,5));//与上面正好相法,是NOT IN
  60. $criteria->addCondition(‘id=1′,’OR’);//这是OR条件,多个条件的时候,该条件是OR而非AND
  61. $criteria->addSearchCondition(‘name’,’分类’);//搜索条件,其实代表了。。where name like ‘%分类%’
  62. $criteria->addBetweenCondition(‘id’, 1, 4);//between 1 and 4
  63. $criteria->compare(‘id’, 1);   //这个方法比较特殊,他会根据你的参数自动处理成addCondition或者addInCondition.
  64. $criteria->compare(‘id’,array(1,2,3));   //即如果第二个参数是数组就会调用addInCondition
  65. $criteria->select =’id,parentid,name’;//代表了要查询的字段,默认select=’*’;
  66. $criteria->join =’xxx’; //连接表
  67. $criteria->with =’xxx’; //调用relations
  68. $criteria->limit = 10;   //取1条数据,如果小于0,则不作处理
  69. $criteria->offset = 1;  //两条合并起来,则表示 limit 10 offset 1,或者代表了。limit 1,10
  70. $criteria->order =’xxx DESC,XXX ASC’ ;//排序条件
  71. $criteria->group =’group 条件’;
  72. $criteria->having =’having 条件 ‘;
  73. $criteria->distinct = FALSE;//是否唯一查询
  74. 三、查询个数,判断查询是否有结果
  75. //该方法是根据一个条件查询一个集合有多少条记录,返回一个int型数字
  76. $n=Post::model()->count($condition,$params);
  77. $n=Post::model()->count(“username=:name”,array(“:name”=>$username));
  78. //该方法是根据SQL语句查询一个集合有多少条记录,返回一个int型数字
  79. $n=Post::model()->countBySql($sql,$params);
  80. $n=Post::model()->countBySql(“select * from admin where username=:name”,array(‘:name’=>’admin’));
  81. //该方法是根据一个条件查询查询得到的数组有没有数据,如果有数据返回一个true,否则没有找到
  82. $exists=Post::model()->exists($condition,$params);
  83. $exists=Post::model()->exists(“name=:name”,array(“:name”=>$username));
  84. 四、新增
  85. $admin= new Admin;
  86. $admin->username =$username;
  87. $admin->password =$password;
  88. if($admin->save() > 0){echo “添加成功”; }else{echo “添加失败”; }
  89. 五、修改
  90. Post::model()->updateAll($attributes,$condition,$params);
  91. $count=Admin::model()->updateAll(array(‘username’=>’11111′,’password’=>’11111′),’password=:pass’,array(‘:pass’=>’1111a1’));
  92. if($count> 0){ echo “修改成功”; }else{echo “修改失败”; }
  93. $rt= PostList::model()->updateAll(array(‘status’=>’1′),’staff_id=:staff AND host_id=:host’,array(‘:staff’=>$staff_id,’:host’=>$host_id));
  94. //$pk主键,可以是一个也可以是一个集合,$attributes是要修改的字段的集合,$condition条件,$params传入的值
  95. Post::model()->updateByPk($pk,$attributes,$condition,$params);
  96. $count=Admin::model()->updateByPk(1,array(‘username’=>’admin’,’password’=>’admin’));
  97. $count=Admin::model()->updateByPk(array(1,2),array(‘username’=>’admin’,’password’=>’admin’),’username=:name’,array(‘:name’=>’admin’));
  98. if($count>0){echo “修改成功”; }else{echo “修改失败”; }
  99. Post::model()->updateCounters($counters,$condition,$params);
  100. $count=Admin::model()->updateCounters(array(‘status’=>1),’username=:name’,array(‘:name’=>’admin’));
  101. if($count> 0){ echo “修改成功”; }else{echo “修改失败”; }
  102. //array(‘status’=>1)代表数据库中的admin表根据条件username=’admin’,查询出的所有结果status字段都自加1
  103. 六、删除
  104. //deleteAll
  105. Post::model()->deleteAll($condition,$params);
  106. $count= Admin::model()->deleteAll(‘username=:name and password=:pass’,array(‘:name’=>’admin’,’:pass’=>’admin’));
  107. $count= Admin::model()->deleteAll(‘id in(“1,2,3”)’);//删除id为这些的数据
  108. if($count>0){echo”删除成功”; }else{echo “删除失败”; }
  109. //deleteByPk
  110. Post::model()->deleteByPk($pk,$condition,$params);
  111. $count= Admin::model()->deleteByPk(1);
  112. $count=Admin::model()->deleteByPk(array(1,2),’username=:name’,array(‘:name’=>’admin’));
  113. if($count>0){echo “删除成功”; }else{echo “删除失败”; }

直接数据库操作

查询

  1. //createCommand(执行原生的SQL语句)
  2. $sql= “SELECT u.account,i.* FROM sys_user as u left join user_info as i on u.id=i.user_id”;
  3. $rows=Yii::$app->db->createCommand($sql)->query();
  4. foreach($rows as $k => $v){
  5.     echo$v[‘add_time’];
  6. }
  7. 查询返回多行:
  8. $command = $connection->createCommand(‘SELECT * FROM post’);
  9. $posts = $command->queryAll();
  10. 返回单行:
  11. $command = $connection->createCommand(‘SELECT * FROM post WHERE id=1’);
  12. $post = $command->queryOne();
  13. 查询多行单值:
  14. $command = $connection->createCommand(‘SELECT title FROM post’);
  15. $titles = $command->queryColumn();
  16. 查询标量值/计算值:
  17. $command = $connection->createCommand(‘SELECT COUNT(*) FROM post’);
  18. $postCount = $command->queryScalar();

更新

  1. $command = $connection->createCommand(‘UPDATE post SET status=1 WHERE id=1’);
  2. $command->execute();

插入更新删除

  1. // INSERT
  2. $connection->createCommand()->insert(‘user’, [
  3.     ‘name’ => ‘Sam’,
  4.     ‘age’ => 30,
  5. ])->execute();
  6. // INSERT 一次插入多行
  7. $connection->createCommand()->batchInsert(‘user’, [‘name’, ‘age’], [
  8.     [‘Tom’, 30],
  9.     [‘Jane’, 20],
  10.     [‘Linda’, 25],
  11. ])->execute();
  12. // UPDATE
  13. $connection->createCommand()->update(‘user’, [‘status’ => 1], ‘age > 30’)->execute();
  14. // DELETE
  15. $connection->createCommand()->delete(‘user’, ‘status = 0’)->execute();

 

事务

  1. //事务的基本结构(多表更新插入操作请使用事务处理)
  2. $dbTrans= Yii::app()->db->beginTransaction();
  3. try{
  4.     $post= new Post;
  5.     $post->’title’= ‘Hello dodobook!!!’;
  6.     if(!$post->save())throw newException(“Error Processing Request”, 1);
  7.     $dbTrans->commit();
  8. //  $this->_end(0,’添加成功!!!’);
  9. }catch(Exception$e){
  10.     $dbTrans->rollback();
  11. //  $this->_end($e->getCode(),$e->getMessage());

YII直接执行SQL语句

$connection = Yii::app()->db; //连接

//查找

$sql = “SELECT * FROM `tbl_user` ORDER BY id DESC”;

$command = $connection->createCommand($sql);

$result = $command->queryAll();

print_r($result);

//添加

$sql = ” INSERT INTO `tbl_user` (`username`, `password`, `email`) VALUES (‘test’, ‘test’, ‘test@test.com’) “;

$command=$connection->createCommand($sql);

print_r($command->execute());

 

//添加 返回自增id

$command1 = $connection->createCommand(“SELECT last_insert_id()”);

$result = $command1->queryAll();

 

//常用函数

(1)如果你执行的SQL语句有返回结果集: 例如SELECT。通常用query开头的系列函数:

$dataReader=$command->query(); // 执行一个 SQL 查询

$rows=$command->queryAll(); // 查询并返回结果中的所有行

$row=$command->queryRow(); // 查询并返回结果中的第一行

$column=$command->queryColumn(); // 查询并返回结果中的第一列

$value=$command->queryScalar(); // 查询并返回结果中第一行的第一个字

(2)你执行的SQL语句返回的不是结果集,只是状态值,例如:INSERT ,UPDATE,DELETE.则用execute()

$this->command->execute();

 

//使用事务的一种常见情形:

CDbTransaction

$transaction = $connection->beginTransaction();

try{

$connection->createCommand($sql1)->execute();

$connection->createCommand($sql2)->execute();

………

$transaction->commit();

}catch(Exception $e){     // 如果有一条查询失败,则会抛出异常

$transaction->rollBack();

}

为什么不用 Yii 的 Model 去操作 DB,原因很简单,Yii 的 Model 写法上是方便了很多,但是会执行多余的 SQL,比如yii自身的log组件

以下是增删改查的四种方法

insert

$row = Yii::app()->getDb()->createCommand()->insert(‘goods’, array(

‘good_name’ => $goods_name,

‘good_type’ => $goods_type,

‘price’ => $price,

‘buy_nums’ => 0,

‘commit_nums’ => 0,

‘create_time’ => time(),

));

select

单表查询

$goodsTypes = Yii::app()->getDb()->createCommand()

->select(‘type_id, type_name’)

->from(‘goods_type’)

->where(‘status=:status’, [

‘:status’ => 1

])

->queryAll();

连表查询

$goods = Yii::app()->getDb()->createCommand()->from(‘goods g’)

->select(‘g.good_id, g.good_name, gt.type_name, g.price, g.buy_nums, g.commit_nums, g.create_time’)

->join(‘goods_type gt’, ‘g.good_type=gt.type_id’)

->where(‘g.`status`=:status1 and gt.`status`=:status2’, [

‘:status1’ => 1,

‘:status2’ => 2

])

->order(‘g.create_time desc’)

->queryAll();

delete

$row = Yii::app()->getDb()->createCommand()

->delete(‘goods’, “good_id=:good_id”, array(

‘:good_id’ => $goods_id,

));

update

$row = Yii::app()->getDb()->createCommand()->update(‘goods’, [

‘good_name’ => $goods_name,

‘good_type’ => $goods_type,

‘price’ => $price,

], “good_id=:good_id”, [

‘:good_id’ => 1

]);

YII路径的用法总结

在yii中如果是 // 就会默认去调 protected/views/layouts,//代表绝对路径。这其实就是绝对和相对的关系 /代表相对路径,如module/user下的layout。使用单斜杠的话默认会先找当前已经激活的模块底下的view,若当前未有激活的模块则从系统根目录下开始找,双斜杠的话就直接从系统根下开始找

Yii framework已经定义的命名空间常量:

system: 指向Yii框架目录; YII\framework
zii: 指向zii library 目录; YII\framework\zii
application: 指向应用程序基本目录;  protected\
webroot: 指向包含里入口脚本文件的目录. 此别名自 1.0.3 版起生效. \
ext: 指向包含所有第三方扩展的目录, 从版本 1.0.8 可用;  \protected\extensions

1

2

3

4

5

Yii::getPathOfAlias(‘zii’)

Yii::import (‘zii.*’)

Yii::setPathOfAlias(‘backend’, $backend);

‘import’ => array(

‘backend.models.*’,

应用的主目录是指包含所有安全系数比较高的PHP代码和数据的根目录。在默认情况下,这个目录一般是入口代码所在目录的一个目录: protected。这个路径可以通过在application configuration里设置 basePath来改变.

YII framework路径:

1

2

Yii::getFrameworkPath()

{full URL}

1 http://localhost/yii_lab/index.php?r=lab/urlBoyLeeTest

protected/venders目录:

1 Yii::import(‘application.venders.*’);

或在protected/config/main.php说明:

1

2

3

4

‘import’=>array(

……

‘application.venders.*’,

),

插入meta信息:

1

2

3

4

5

Yii::app()->clientScript->registerMetaTag(‘keywords’,’关键字’);

Yii::app()->clientScript->registerMetaTag(‘description’,’一些描述’);

Yii::app()->clientScript->registerMetaTag(‘author’,’作者’);

Yii::app()->clientScript->registerLinkTag(‘alternate’,’application/rss+xml’,$this->createUrl(‘/feed’));

在控制器添加CSS文件或JavaScript文件:

1

2

3

Yii::app()->clientScript->registerCssFile(Yii::app()->baseUrl.’/css/my.css’);

Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl.’/css/my.js’);

调用YII框架中framework/web/js/source的js,其中registerCoreScript key调用的文件在framework/web/js/packages.php列表中可以查看:

1 Yii::app()->clientScript->registerCoreScript(‘jquery’);

在view中得到当前controller的ID方法:

1 Yii::app()->getController()->id;

在view中得到当前action的ID方法:

1 Yii::app()->getController()->getAction()->id;

yii获取ip地址

1 Yii::app()->request->userHostAddress;

yii判断提交方式

1 Yii::app()->request->isPostRequest

得到当前域名:

1 Yii::app()->request->hostInfo

得到proteced目录的物理路径

1 YII::app()->basePath;

获得上一页的url以返回

1 Yii::app()->request->urlReferrer;

得到当前url

1 Yii::app()->request->url;

得到当前home url

1 Yii::app()->homeUrl

得到当前return url

1 Yii::app()->user->returnUrl

项目路径

1 dirname(Yii::app()->BasePath)

如果你自己有个目录下有些类或文件常用,可以在main.php的最上边定义一个路径别名,别名可以被翻译为其相应的路径。

1 Yii::getPathOfAlias(‘webroot’)

如果是多个可以在main.php中的array中加一个配置