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 相关文章推荐
smarty实例教程
Nov 19 PHP
PHP时间戳使用实例代码
Jun 07 PHP
php5.5新数组函数array_column使用
Jul 08 PHP
php多层数组与对象的转换实例代码
Aug 05 PHP
php获取根域名方法汇总
Oct 28 PHP
php防止sql注入之过滤分页参数实例
Nov 03 PHP
phpstorm编辑器乱码问题解决
Dec 01 PHP
PHP怎样用正则抓取页面中的网址
Aug 09 PHP
PHP的Json中文处理解决方案
Sep 29 PHP
PHP调用API接口实现天气查询功能的示例
Sep 21 PHP
php 广告点击统计代码(php+mysql)
Feb 21 PHP
PHP网站常见安全漏洞,及相应防范措施总结
Mar 01 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函数
2006/10/09 PHP
如何使用PHP中的字符串函数
2006/11/24 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
PHP iconv()函数字符编码转换的问题讲解
2019/03/22 PHP
jQuery获取文本节点之 text()/val()/html() 方法区别
2011/03/01 Javascript
jquery判断浏览器类型的代码
2012/11/05 Javascript
用js设置下拉框为只读的小技巧
2014/04/10 Javascript
JavaScript插件化开发教程(六)
2015/02/01 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
用jmSlip编写移动端顶部日历选择控件
2016/10/24 Javascript
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
vue中过滤器filter的讲解
2019/01/21 Javascript
通过实例了解js函数中参数的传递
2019/06/15 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
2020/07/18 Javascript
Vue实现随机验证码功能
2020/12/29 Vue.js
Python高级应用实例对比:高效计算大文件中的最长行的长度
2014/06/08 Python
Python简单实现Base64编码和解码的方法
2017/04/29 Python
python使用Apriori算法进行关联性解析
2017/12/21 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
Django 允许局域网中的机器访问你的主机操作
2020/05/13 Python
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
2021/03/17 Javascript
HTML5的自定义属性data-*详细介绍和JS操作实例
2014/04/10 HTML / CSS
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
爱尔兰旅游网站:ebookers.ie
2020/01/24 全球购物
工厂实习感言
2014/01/14 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
依法行政工作汇报
2014/10/28 职场文书
2014年班组工作总结
2014/11/20 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android