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 相关文章推荐
Excel数据导入Mysql数据库的实现代码
Jun 05 PHP
献给php初学者(入门学习经验谈)
Oct 12 PHP
thinkphp的CURD和查询方式介绍
Dec 19 PHP
php过滤敏感词的示例
Mar 31 PHP
php实现猴子选大王问题算法实例
Apr 20 PHP
深入剖析PHP中printf()函数格式化使用
May 23 PHP
PHP标准类(stdclass)用法示例
Sep 28 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
Mar 15 PHP
php实现将二维关联数组转换成字符串的方法详解
Jul 31 PHP
PHP实现非阻塞模式的方法分析
Jul 26 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
Jan 22 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 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的ASCII码转换类
2013/07/05 PHP
php策略模式简单示例分析【区别于工厂模式】
2019/09/25 PHP
PHP文件打开关闭及读写操作示例解析
2020/08/06 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
ASP.NET jQuery 实例7 通过jQuery来获取DropDownList的Text/Value属性值
2012/02/03 Javascript
javasctipt如何显示几分钟前、几天前等
2014/04/30 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
JavaScript中的闭包(Closure)详细介绍
2014/12/30 Javascript
jquery实现表单验证并阻止非法提交
2015/07/09 Javascript
百度地图API之本地搜索与范围搜索
2015/07/30 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
2015/08/19 Javascript
jQuery EasyUI Draggable拖动组件
2017/03/01 Javascript
JS实现商品筛选功能
2020/08/19 Javascript
微信小程序-滚动消息通知的实例代码
2017/08/03 Javascript
javaScript手机号码校验工具类PhoneUtils详解
2017/12/08 Javascript
浅谈Node.js 子进程与应用场景
2018/01/24 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
JS中比较两个Object数组是否相等方法实例
2019/11/11 Javascript
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
200 行python 代码实现 2048 游戏
2018/01/12 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
2019/02/21 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
python中多个装饰器的调用顺序详解
2019/07/16 Python
python实现图片二值化及灰度处理方式
2019/12/07 Python
Python Pandas list列表数据列拆分成多行的方法实现
2020/12/14 Python
全球速卖通巴西站点:Aliexpress巴西
2016/08/24 全球购物
中学生打架检讨书
2014/02/10 职场文书
平面设计专业大学生职业规划书
2014/03/12 职场文书
学历公证书范本
2014/04/09 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
Pytorch GPU内存占用很高,但是利用率很低如何解决
2021/06/01 Python
Go 通过结构struct实现接口interface的问题
2021/10/05 Golang
python井字棋游戏实现人机对战
2022/04/28 Python
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技