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,6]])
            ->all();

        //count统计
        $count = (new Query())->from('{{%user}}')->count();
        echo '总记录数: ',$count;

        //大于,大于等于,小于,小于等于where条件
        $data8 = (new Query())->select(['id','name'])
            ->from('{{%user}}')
            ->where(['>=',5])
            ->all();

        $data9 = (new Query())->select(['id','name'])
            ->from('{{%user}}')
            ->where(['<=',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' => 'bbb'],],['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],['like','aa'],'bb'],])
            ->all();

        //有些时候我们需要根据用户传递过来的参数追加where条件
        //追加and条件
        $query = (new Query())->select(['id','name'])
            ->from('{{%user}}')
            ->where('sex=1');
        //追加age大于18的条件
        $query->andWhere(['>',18]);
        echo $query->createCommand()->getRawSql();

        //追加or条件
        $query2 = (new Query())->select(['id','aa']);
        //追加name相似bb的条件
        $query2->orWhere(['like','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();
    }
}

  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1、将Yii2.0advanced版中应用主体frontend或backend应用复制为api应用2、在应用主体api目录的controller新建SiteController.php:namespaceapi\controllers;useYii;useyii\rest\ActiveController;/*SiteController测试控制器*/classSiteControllerextendsActiveCon
Yii2restfulAPI文档一、配置模块:1.Config/main.php:  2.创建模块目录:  3.Module.php:  二、路由配置:  三、控制器:  四、Models:   五、测试:GET:  POST:  PUT:      DELETE:  
Yii在framework/i18n/data/%lang%.php文件中有很多翻译.这是例如germantranslations我想在我的Yii项目中使用Fullcalendar.要翻译此日历,我必须为当前语言提供一个monthNames/dayNames数组.FullcalendarmonthNamesDocumentationYii生成数组的最佳方法是什么:['January'
在Yii2中,官方的页面多语言解决方案有两个:方案1,使用Yii::t()函数,在页面中需要输出文字的地方,使用类似如下代码:<?=Yii::t(‘views/login’,‘hello’)?>这样做的后果是页面上大量充斥着类似的代码,导致页面可读性很差,而且对于同一个页面来说,Yii::t()函数的第一个参数基本上都是
Yii2.0对数据库查询的一些简单的操作123456789101112131415161718192021222324252627282930313233343536373839User::findOne($id);   //此方法返回 主键 id=1  的一条数据(举个例子);  User::find()->where(['name' =
数据查询User::find()->all();此方法返回所有数据;User::findOne($id);此方法返回主键id=1的一条数据(举个例子);User::find()->where(['name'=>'小伙儿'])->one();此方法返回['name'=>'小伙儿']的一条数据;User::find()->where(['n
最近打算提升自己的解决问题能力,于是打算从学习其他框架下手,让我们先去了解yii框架是如何运作的吧!https://www.yiichina.com/访问yii中文网站  让我们先把框架下载下来点击下载框架 科普一下:目前yii框架有三个版本yii1.0、yii1.1、yii2.0貌似即将推出3.0 这里我们
如何在Yii2中检查模型属性的类型(列类型)?ThisoldYiiForumanswer给了我一个结论,在Yii1中我可以使用类似的东西:$model->getMetaData()->columns['attribute-name']->type;但我没有成功将此解决方案移植到Yii2.有人可以帮忙吗?解决方法:您可以使用:$model->getTableSchema()
defined('YII_DEBUG')ordefine('YII_DEBUG',true);defined('YII_ENV')ordefine('YII_ENV','dev');require(__DIR__.'/../vendor/autoload.php');//注册类加载器require(__DIR__.'/../vendor/yii
在NGINX中配置:location/{   if(!-e$request_filename){    rewrite^/(.*)/index.phplast;}这样,当NGINX找不到文件的时候,就会将URL重写为index.php。对于URL中只有域名的情况,因为不存在对应的文件,所以会匹配到。再配置:location~\.php${  include
Yii2.0封装的类足够强大,Mailer的使用方法做一个总结:1、先在main-local.php中做好配置:return[//....'components'=>['mailer'=>['class'=>'yii\swiftmailer\Mailer',],],];详细如下:return[//....'components'=>[
每当我尝试登录我的Yii应用程序时,它都会显示错误CDbConnectionfailedtoopentheDBconnection:couldnotfinddriver.我google了很多个小时,从许多博客我知道我需要pdo_mysql,但已经安装了.在php.ini中我也对这些行做了评论;extension=php_pdo_mysql.dll;extension
我有一个模型Aziende,它与称为Annunci的花药模型相关(1:N),如下所示:'annunci'=>array(self::HAS_MANY,'Annunci','azienda_id'),我想算一下有多少记录确实有这种关系,在mySql中我会做:SELECTcount(*)FROM`aziende`aJOINannuncianONan.azienda_id=a.id我怎么能
我们有一个项目,为孟加拉国最大的服装行业之一建立一个ERP系统.他们有大约20,000名员工,其中约10%的员工每个月都会离职.我们是一家拥有5名PHP开发人员的小公司,对这么大的项目没有多少经验.我们之前使用Codeigniter/ZendFramework和MySQL数据库开发了不同的中小规模项目.对于
我在Yii中有一些表单,使用以下内容以下拉形式从相关表中获取数据列表:dropDownList(CHtml::listData(Company::model()->findAll(array('order'=>'companyASC'))));这是有效的,但这意味着对于每个下拉列表(其中很多)我将这个数组(‘order’=>’公司ASC’放在每一个中.这是最
本文采用Yii文档,经过自己的修改,让读者更容易理解预定义完整列表: boolean : CBooleanValidator 的别名,确保属性的值是CBooleanValidator::trueValue 或CBooleanValidator::falseValue .captcha : CCaptchaValidator 的别名,确保了特性的值等于 CAPTCHA 显示出来
前面已经安装好了yii框架,现在我们来建立第一个Yii应用1、进入您网站更目录2、执行命令:YiiRoot/framework/yiicwebapptestdrive说明:这里的YiiRoot为您Yii框架的安装目录。3、输入以上命令后,会出现一个提示信息:PHPWarning:PHPStartup:Unabletol
一、ThinkPHPThinkPHP(FCS)是一个轻量级的中型框架,是从Java的Struts结构移植过来的中文PHP开发框架。它使用面向对象的开发结构和MVC模式,并且模拟实现了Struts的标签库,各方面都比较人性化,熟悉J2EE的开发人员相对比较容易上手,适合php框架初学者。ThinkPHP的宗旨是简化开发、提
我必须实现标题中提到的验证,即需要两个字段之一(电子邮件,电话).我在我的模型中这样做:[['email'],'either',['other'=>['phone']]],这是方法:publicfunctioneither($attribute_name,$params){$field1=$this->getAttributeLabel($attribute_nam
我试图得到(StatusCode)响应RESTapi,而它只返回字段名称和错误消息,如下所示[{"field":"Email","message":"Email\"ali@ali.ali\"hasalreadybeentaken."}]我添加了回复'response'=>['class'=>'