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 相关文章推荐
用ODBC的分页显示
Oct 09 PHP
php 读取shell管道传输过来的内容
Mar 01 PHP
ThinkPHP模板替换与系统常量及应用实例教程
Aug 22 PHP
laravel 5 实现模板主题功能
Mar 02 PHP
php实现从上传文件创建缩略图的方法
Apr 02 PHP
PHP实现抓取迅雷VIP账号的方法
Jul 30 PHP
php生成二维码
Aug 10 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
Dec 21 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
May 21 PHP
PHP基于array_unique实现二维数组去重
Jul 14 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
Oct 20 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
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
PHP实现会员账号单唯一登录的方法分析
2019/03/07 PHP
js性能优化 如何更快速加载你的JavaScript页面
2012/03/17 Javascript
js判读浏览器是否支持html5的canvas的代码
2013/11/18 Javascript
Chrome扩展页面动态绑定JS事件提示错误
2014/02/11 Javascript
Node.js插件的正确编写方式
2014/08/03 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
第九篇Bootstrap导航菜单创建步骤详解
2016/06/21 Javascript
Bootstrap插件全集
2016/07/18 Javascript
原生JS实现N级菜单的代码
2017/05/21 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
教你用Cordova打包Vue项目的方法
2017/10/17 Javascript
JS实现的抛物线运动效果示例
2018/01/30 Javascript
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
JQuery选中select组件被选中的值方法
2018/03/08 jQuery
iview table高度动态设置方法
2018/03/14 Javascript
bootstrap与pagehelper实现分页效果
2018/12/29 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
Vue+webpack实现懒加载过程解析
2020/02/17 Javascript
vue中实现动态生成二维码的方法
2020/02/21 Javascript
[07:59]2014DOTA2叨叨刀塔 林熊猫称被邀请赛现场盛况震撼
2014/07/21 DOTA
Python中内置数据类型list,tuple,dict,set的区别和用法
2015/12/14 Python
Python中使用asyncio 封装文件读写
2016/09/11 Python
基于pandas数据样本行列选取的方法
2018/04/20 Python
解决Pycharm运行时找不到文件的问题
2018/10/29 Python
对dataframe数据之间求补集的实例详解
2019/01/30 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
Django URL参数Template反向解析
2020/11/24 Python
解决pytorch下出现multi-target not supported at的一种可能原因
2021/02/06 Python
美国最大的家庭鞋类零售商之一:Shoe Carnival
2017/10/06 全球购物
历史学专业个人的自我评价
2013/10/13 职场文书
大学系主任推荐信范文
2013/12/24 职场文书
英文请假条
2014/04/11 职场文书
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python
Shell脚本一键安装Nginx服务自定义Nginx版本
2022/03/20 Servers