Yii2 数据操作Query Builder

来源:互联网 发布:java手机软件 编辑:程序博客网 时间:2024/06/05 17:23

Query Builder

[php] view plaincopy
  1. $rows = (new \yii\db\Query())  
  2.     ->select(['dyn_id''dyn_name'])  
  3.     ->from('zs_dynasty')  
  4.     ->where(['between','dyn_id', 1,30])  
  5.     ->limit(10)  
  6.     ->all();  
  7. print_r($rows);  

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. use yii\db\Query;  
  2. $query = (new Query())  
  3.     ->from('user')  
  4.     ->orderBy('id');  

SELECT
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. $query->select('*')->  
  2. select('dyn_id as id, dynasty.dyn_name')->  
  3. $query->select(['dyn_id as id'"CONCAT(dyn_name,'a')"])->  
  4. $query->select('user_id')->distinct()->  



FORM
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. $query->from('user');  
  2. $query->from(['public.user u''public.post p']);  
  3. $query->from('public.user u, public.post p');  
  4. $query->from(['u' => 'public.user''p' => 'public.post']);  
  5. ----------  
  6. $subQuery = (new Query())->select('id')->from('user')->where('status=1');  
  7. // SELECT * FROM (SELECT `id` FROM `user` WHERE status=1) u   
  8. $query->from(['u' => $subQuery]);  

WHERE
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. where('status=1')->  
  2. where('status=:status', [':status' => $status])->  
  3. where([  
  4.     'status' => 10,  
  5.     'type' => null,  
  6.     'id' => [4, 8, 15],  
  7. ])->  
  8. -------  
  9. $userQuery = (new Query())->select('id')->from('user');  
  10. // ...WHERE `id` IN (SELECT `id` FROM `user`)  
  11. $query->...->where(['id' => $userQuery])->...  
  12. --------  
  13. ['and''id=1''id=2'//id=1 AND id=2  
  14. ['and''type=1', ['or''id=1''id=2']] //type=1 AND (id=1 OR id=2)  
  15. ['between''id', 1, 10] //id BETWEEN 1 AND 10  
  16. ['not between''id', 1, 10] //not id BETWEEN 1 AND 10  
  17. ['in''id', [1, 2, 3]] //id IN (1, 2, 3)  
  18. ['not in''id', [1, 2, 3]] //not id IN (1, 2, 3)  
  19. ['like''name''tester'//name LIKE '%tester%'  
  20. ['like''name', ['test''sample']] //name LIKE '%test%' AND name LIKE '%sample%'  
  21. ['not like''name', ['or''test''sample']] //not name LIKE '%test%' OR not name LIKE '%sample%'  
  22. ['exists','id'$userQuery//EXISTS (sub-query) | not exists  
  23. ['>''age', 10] //age>10  

ADD WHERE
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. $status = 10;  
  2. $search = 'yii';  
  3. $query->where(['status' => $status]);  
  4. if (!empty($search)) {  
  5.     $query->andWhere(['like''title'$search]);  
  6. }  
  7. //WHERE (`status` = 10) AND (`title` LIKE '%yii%')  
  8. //andWhere() or orWhere()  


FILTER WHERE

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. $query->filterWhere([  
  2.     'username' => $username,  
  3.     'email' => $email,  
  4. ]);  
  5. //如果email为空,则 WHERE username=:username  

ORDER BY
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. $query->orderBy([  
  2.     'id' => SORT_ASC,  
  3.     'name' => SORT_DESC,  
  4. ]);  
  5. //orderBy , addOrderBy  

GROUP BY
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. $query->groupBy('id, status');  
  2. $query->addGroupBy(['created_at''updated_at']);  

HAVING 

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. $query->having(['status' => $status]);  
  2. //having,andHaving,orHaving  

LIMIT OR OFFSET
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. $query->limit(10);  
  2. $query->offset(10);  

JOIN
  • innerJoin()
  • leftJoin()
  • rightJoin()
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. $query->select(['user.name AS author''post.title as title'])  
  2.     ->from('user')  
  3.     ->leftJoin('post''post.user_id = user.id');  
  4. $query->join('FULL OUTER JOIN''post''post.user_id = user.id');  
  5. $query->leftJoin(['u' => $subQuery], 'u.id=author_id');  


UNION
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. $query = new Query();  
  2. $query->select("id, category_id as type, name")->from('post')->limit(10);  
  3. $anotherQuery = new Query();  
  4. $anotherQuery->select('id, type, name')->from('user')->limit(10);  
  5. $query->union($anotherQuery);  

QUERY METHODS
  • all() //所有行列
  • one() //第一行
  • column() //第一列
  • scalar() //第一行第一列
  • exists() //是否有结果存在
  • count() //记录数量
  • sum($q), average($q), max($q), min($q) //$q 为字段或表达式
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. $count = (new \yii\db\Query())  
  2.     ->from('user')  
  3.     ->where(['last_name' => 'Smith'])  
  4.     ->count();  
  5. //SELECT COUNT(*) FROM `user` WHERE `last_name`=:last_name  
  6.   
  7.   
  8. $command = (new \yii\db\Query())  
  9.     ->select(['id''email'])  
  10.     ->from('user')  
  11.     ->where(['last_name' => 'Smith'])  
  12.     ->limit(10)  
  13.     ->createCommand();  
  14.       
  15. // show the SQL statement  
  16. echo $command->sql;  
  17. // show the parameters to be bound  
  18. print_r($command->params);  
  19.   
  20.   
  21. // returns all rows of the query result  
  22. $rows = $command->queryAll();  

QUERY RESULTS
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. use yii\db\Query;  
  2. $query = (new Query())  
  3.     ->from('user')  
  4.     ->indexBy('username');  
  5. foreach ($query->batch() as $users) {  
  6.     // $users is indexed by the "username" column  
  7. }  
  8. foreach ($query->each() as $username => $user) {  
  9. }  


INDEXING
[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. use yii\db\Query;  
  2. $query = (new Query())  
  3.     ->from('user')  
  4.     ->orderBy('id');  
  5. foreach ($query->batch() as $users) {  
  6.     // batch( $batchSize = 100, $db = null )  
  7.     // 一个批次取100行  
  8. }  
  9. foreach ($query->each() as $user) {  
  10.     // 一行一行取  
  11. }  

对象操作

查询

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

直接数据库操作

查询

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  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. 查询返回多行:  
  9.   
  10. $command = $connection->createCommand('SELECT * FROM post');  
  11. $posts = $command->queryAll();  
  12. 返回单行:  
  13.   
  14. $command = $connection->createCommand('SELECT * FROM post WHERE id=1');  
  15. $post = $command->queryOne();  
  16. 查询多行单值:  
  17.   
  18. $command = $connection->createCommand('SELECT title FROM post');  
  19. $titles = $command->queryColumn();  
  20. 查询标量值/计算值:  
  21.   
  22. $command = $connection->createCommand('SELECT COUNT(*) FROM post');  
  23. $postCount = $command->queryScalar();  

更新

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. $command = $connection->createCommand('UPDATE post SET status=1 WHERE id=1');  
  2. $command->execute();  

插入更新删除

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1. // INSERT  
  2. $connection->createCommand()->insert('user', [  
  3.     'name' => 'Sam',  
  4.     'age' => 30,  
  5. ])->execute();  
  6.   
  7. // INSERT 一次插入多行  
  8. $connection->createCommand()->batchInsert('user', ['name''age'], [  
  9.     ['Tom', 30],  
  10.     ['Jane', 20],  
  11.     ['Linda', 25],  
  12. ])->execute();  
  13.   
  14. // UPDATE  
  15. $connection->createCommand()->update('user', ['status' => 1], 'age > 30')->execute();  
  16.   
  17. // DELETE  
  18. $connection->createCommand()->delete('user''status = 0')->execute();  


事务

[php] view plaincopy在CODE上查看代码片派生到我的代码片
  1.    
  2. //事务的基本结构(多表更新插入操作请使用事务处理)  
  3. $dbTrans= Yii::app()->db->beginTransaction();  
  4. try{  
  5.     $postnew Post;  
  6.     $post->'title''Hello dodobook!!!';  
  7.     if(!$post->save())throw newException("Error Processing Request", 1);  
  8.     $dbTrans->commit();  
  9. //  $this->_end(0,'添加成功!!!');  
  10. }catch(Exception$e){  
  11.     $dbTrans->rollback();  
  12. //  $this->_end($e->getCode(),$e->getMessage());  

参考:
http://blog.csdn.net/yafei450225664/article/details/41543591
http://www.kuitao8.com/20150115/3471.shtml

转载:http://blog.csdn.net/xundh/article/details/45955195
http://blog.csdn.net/hzqghost/article/details/44117081



0 0