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 相关文章推荐
多文件上载系统完整版
Oct 09 PHP
测试您的 PHP 水平的题目
May 30 PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 PHP
一个php短网址的生成代码(仿微博短网址)
May 07 PHP
php简单分页类实现方法
Feb 26 PHP
php实现将任意进制数转换成10进制的方法
Apr 17 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
Oct 22 PHP
PHP实践教程之过滤、验证、转义与密码详解
Jul 24 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
详解php伪造Referer请求反盗链资源
Jan 24 PHP
PHP实现cookie跨域session共享的方法分析
Aug 23 PHP
TP5框架实现上传多张图片的方法分析
Mar 29 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文件管理基本功能简单操作
2017/01/16 PHP
调试php程序的简单步骤
2019/10/04 PHP
JQuery 前台切换网站的样式实现
2009/06/22 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
详解微信小程序审核不通过的解决方法
2018/01/17 Javascript
浅谈React组件之性能优化
2018/03/02 Javascript
layui 给数据表格加序号的方法
2018/08/20 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
2019/06/03 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
JavaScript基于SVG的图片切换效果实例代码
2020/12/15 Javascript
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
Python线程指南详细介绍
2017/01/05 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
2018/02/23 Python
详解Django的CSRF认证实现
2018/10/09 Python
django fernet fields字段加密实践详解
2019/08/12 Python
Python Gitlab Api 使用方法
2019/08/28 Python
python3获取url文件大小示例代码
2019/09/18 Python
python plt可视化——打印特殊符号和制作图例代码
2020/04/17 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
详解HTML5中垂直上下居中的解决方案
2017/12/20 HTML / CSS
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
Skip Hop官网:好莱坞宝宝挚爱品牌
2018/06/17 全球购物
生产部岗位职责范文
2014/02/07 职场文书
《草虫的村落》教学反思
2014/02/16 职场文书
金融管理毕业生求职信
2014/03/03 职场文书
销售内勤岗位职责
2014/04/15 职场文书
2015年挂职锻炼工作总结
2014/12/12 职场文书
社区青年志愿者活动总结
2015/05/06 职场文书
导游词之山西祁县乔家大院
2019/10/14 职场文书
JavaScript 语句之常用 for 循环详解
2021/03/29 Javascript
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers