YII2框架中查询生成器Query()的使用方法示例


Posted in PHP onMarch 18, 2020

本文实例讲述了YII2框架中查询生成器Query()的使用方法。分享给大家供大家参考,具体如下:

YII2中的yii\db\Query给我们提供了非常丰富的方法,方便我们构建复杂的SQL语句。

Query()与createCommand最大区别在于,后者直接使用我们写好的SQL语句,前者通过参数和数据库类型生成不同SQL,迁移性更好。

<?php
namespace app\controllers;
 
use YII;
use yii\db\Query;
use yii\web\Controller;
 
class TestController extends Controller
{
  public function actionTest()
  {
    //YII2的Query的使用
    //Query与createCommand的区别是createCommand是直接写一个SQL来执行。
    //Query是根据参数和数据库类型生成不同的SQL,提升数据库可迁移性。
 
    //通过all查询多条记录
    //我这里用tb_user表来进行演示
    $data1 = (new Query())->select(['id', 'name'])
      ->from('{{%user}}')
      ->all();
 
    //指定where条件查询
    $data2 = (new Query())->select(['id', 'name'])
      ->from('{{%user}}')
      ->where('id=:id', [':id' => '2'])
      ->all();
 
    //通过one查询单条记录
    $data3 = (new Query())->select(['id', 'name'])
      ->from('{{%user}}')
      ->where('id=3')
      ->one();
 
    //判断记录是否存在
    $exists = (new Query())->from('{{%user}}')
      ->where('name="aaa"')
      ->exists();
 
    if ($exists) {
      echo 'name=aaa 存在';
    }
 
    //定义字段别名
    //注意真实的字段名写后面,别名写前面
    $data4 = (new Query())->select(['ids' => 'id', 'names' => 'name'])
      ->from('{{%user}}')
      ->where('1=1')
      ->all();
 
    //通过orderby排序,和limit限制条数
    $data5 = (new Query())->select(['id', 'name'])
      ->from('{{%user}}')
      ->where('1=1')
      ->orderBy('id desc')
      ->limit(3)
      ->all();
 
    //多个and条件
    //参数是数组,一个key对应一个value,默认以and拼接
    $data6 = (new Query())->select(['id', 'name'])
      ->from('{{%user}}')
      ->where(['id' => 3, 'name' => 'aaa'])
      ->one();
 
    //in条件
    $data7 = (new Query())->select(['id', 'name'])
      ->from('{{%user}}')
      ->where(['id' => [4, 5, 6]])
      ->all();
 
    //或者如下方式
    $data7_2 = (new Query())->select(['id', 'name'])
      ->from('{{%user}}')
      ->where(['in', 'id', [4, 5, 6]])
      ->all();
 
    //count统计
    $count = (new Query())->from('{{%user}}')->count();
    echo '总记录数: ', $count;
 
    //大于,大于等于,小于,小于等于where条件
    $data8 = (new Query())->select(['id', 'name'])
      ->from('{{%user}}')
      ->where(['>=', 'id', 5])
      ->all();
 
    $data9 = (new Query())->select(['id', 'name'])
      ->from('{{%user}}')
      ->where(['<=', 'id', 3])
      ->all();
 
    //like查询
    $data10 = (new Query())->select(['id', 'name'])
      ->from('{{%user}}')
      ->where(['like', 'name', 'dd'])
      ->all();
 
    //between筛选和group by分组
    //查找出age在18到24之间的,并按sex分组
    $data11 = (new Query())->select(['id', 'name'])
      ->from('{{%user}}')
      ->where(['between', 'age', 18, 24])
      ->groupBy('sex')
      ->all();
 
    //having筛选
    //按sex分组,然后统计人数大于3的
    $data12 = (new Query())->select(['sex', 'cnt' => 'count(*)'])
      ->from('{{%user}}')
      ->groupBy('sex')
      ->having('cnt > 3')
      ->all();
 
    //or逻辑条件
    //查找姓名为aaa或bbb的用户
    //之前where数组是以key=>value方式传递的,如果要表达复杂逻辑关系,
    //数组第一个元素必须声明是什么逻辑,and还是or
    //第二个元素表示逻辑左边
    //第三个元素表示逻辑右边
    $data13 = (new Query())->select(['id', 'name'])
      ->from('{{%user}}')
      ->where(['or', ['name' => 'aaa'], ['name' => 'bbb']])
      ->all();
 
    //复杂的where条件
    //我这里只是作为演示
    //SELECT `id`, `name` FROM `tb_user` WHERE ((`name`='aaa') OR (`name`='bbb')) OR ((`name`='ccc') OR (`name`='ddd'))
    $data14 = (new Query())->select(['id', 'name'])
      ->from('{{%user}}')
      ->where([
        'or',
        [
          'or',
          ['name' => 'aaa'],
          ['name' => 'bbb'],
        ],
        [
          'or',
          ['name' => 'ccc'],
          ['name' => 'ddd'],
        ],
      ])
      ->all();
 
    //and和or嵌套where条件
    //SELECT `id`, `name` FROM `tb_user` WHERE (`sex`=1) AND ((`name` LIKE '%aa%') OR (`name` LIKE '%bb%'))
    $data15 = (new Query())->select(['id', 'name'])
      ->from('{{%user}}')
      ->where([
        'and',
        ['sex' => 1],
        [
          'or',
          ['like', 'name', 'aa'],
          ['like', 'name', 'bb'],
        ],
      ])
      ->all();
 
    //有些时候我们需要根据用户传递过来的参数追加where条件
    //追加and条件
    $query = (new Query())->select(['id', 'name'])
      ->from('{{%user}}')
      ->where('sex=1');
    //追加age大于18的条件
    $query->andWhere(['>', 'age', 18]);
    echo $query->createCommand()->getRawSql();
 
    //追加or条件
    $query2 = (new Query())->select(['id', 'name'])
      ->from('{{%user}}')
      ->where(['like', 'name', 'aa']);
    //追加name相似bb的条件
    $query2->orWhere(['like', 'name', 'bb']);
    echo $query2->createCommand()->getRawSql();
 
    //表别名和连接查询
    //SELECT `u`.`id`, `u`.`name`, `aa`.`item_name` FROM `tb_user` `u` LEFT JOIN `tb_auth_assignment` `aa` ON aa.user_id = u.id
    $data16 = (new Query())->select(['u.id', 'u.name', 'aa.item_name'])
      ->from(['u' => '{{%user}}'])
      ->leftJoin(['aa' => '{{%auth_assignment}}'], 'aa.user_id = u.id')
      ->all();
  }
}

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
常用的php ADODB使用方法集锦
Mar 25 PHP
PHP调用MySQL的存储过程的实现代码
Aug 12 PHP
基于asp+ajax和数据库驱动的二级联动菜单
May 06 PHP
php代码收集表单内容并写入文件的代码
Jan 29 PHP
PHP中使用mktime获取时间戳的一个黑色幽默分析
May 31 PHP
php函数间的参数传递(值传递/引用传递)
Sep 23 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
Mar 18 PHP
PHP常见错误提示含义解释(实用!值得收藏)
Apr 25 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
Sep 23 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
Jan 21 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
Oct 15 PHP
laravel ajax curd 搜索登录判断功能的实现
Apr 17 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
Mar 18 #PHP
Laravel框架下的Contracts契约详解
Mar 17 #PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
Mar 16 #PHP
PHP代码加密的方法总结
Mar 13 #PHP
YII2框架中behavior行为的理解与使用方法示例
Mar 13 #PHP
YII2框架中actions的作用与使用方法示例
Mar 13 #PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 #PHP
You might like
第十四节 命名空间 [14]
2006/10/09 PHP
批量修改RAR文件注释的php代码
2010/11/20 PHP
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
jcrop基本参数一览
2013/07/16 Javascript
JavaScript语言对Unicode字符集的支持详解
2014/12/30 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
JavaScript中Number对象的toFixed() 方法详解
2016/09/02 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
2017/01/11 Javascript
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
webpack的CSS加载器的使用
2018/09/11 Javascript
NodeJS搭建HTTP服务器的实现步骤
2018/10/12 NodeJs
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
深入分析jQuery.one() 函数
2020/06/03 jQuery
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
[02:15]2014DOTA2国际邀请赛 专访LGD.lin小兔子是大腿
2014/07/14 DOTA
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
2020/03/23 Python
html5 乒乓球(碰撞检测)实例二
2013/07/25 HTML / CSS
Woods官网:加拿大最古老、最受尊敬的户外品牌之一
2020/09/12 全球购物
存储过程的优点有哪些
2012/09/27 面试题
Linux常见面试题
2013/03/18 面试题
大四本科生的自我评价
2013/12/30 职场文书
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
营销团队口号
2014/06/06 职场文书
志愿者活动总结报告
2014/06/27 职场文书
幼儿园保育员责任书
2014/07/22 职场文书
奥巴马当选演讲稿
2014/09/10 职场文书
软件测试专业推荐信
2014/09/18 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
党员检讨书范文
2014/12/27 职场文书
护士实习自荐信
2015/03/06 职场文书
Python中time与datetime模块使用方法详解
2022/03/31 Python
Python闭包的定义和使用方法
2022/04/11 Python