当前位置: 首页 > news >正文

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();
    }
}

  

转载于:https://www.cnblogs.com/jkko123/p/8681593.html

相关文章:

  • notepad++(NPP) 任意多光标编辑,超越列块模式
  • JAVA jdk安装教程及环境变量配置
  • 第一阶段:前端开发_HTMLCSS
  • JavaScript正则表达式学习笔记(一)
  • 转载:ORA-12516 “TNS监听程序找不到符合协议堆栈要求的可用处理程序” 解决方案...
  • 深入浅出MyBatis:反射和动态代理
  • 阿里云服务器 从0 配置Node Nginx 免密ssh 等 环境实现 pm2一键线上部署
  • C# 谁改了我的代码 使用 Resharper 快速做适配器
  • 学不好Linux?我们分析看看正确的学习方法是什么
  • openssl的应用及创建CA
  • 基于zookeeper的高可用Hadoop HA集群安装
  • 归并排序的相关用法
  • 前端js -- this指向总结。
  • 理解Java集合(三)Map : HashMap/SortedMap/TreeMap
  • java io流
  • 【Leetcode】101. 对称二叉树
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 2019年如何成为全栈工程师?
  • Angular 响应式表单之下拉框
  • golang中接口赋值与方法集
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JavaScript学习总结——原型
  • PaddlePaddle-GitHub的正确打开姿势
  • php ci框架整合银盛支付
  • unity如何实现一个固定宽度的orthagraphic相机
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 算法-图和图算法
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #Z2294. 打印树的直径
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • %@ page import=%的用法
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .bat批处理(一):@echo off
  • .htaccess配置常用技巧
  • .net 简单实现MD5
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @JsonSerialize注解的使用
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [14]内置对象
  • [20171113]修改表结构删除列相关问题4.txt
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [Android] Upload package to device fails #2720
  • [Asp.net MVC]Bundle合并,压缩js、css文件