如何在YII2框架中使用Query()查询生成器

这篇文章将为大家详细讲解有关如何在YII2框架中使用Query()查询生成器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

YII2中的yii\db\Query给我们提供了非常丰富的方法,方便我们构建复杂的SQL语句。

如何在YII2框架中使用Query()查询生成器

Query()与createCommand最大区别在于,后者直接使用我们写好的SQL语句,前者通过参数和数据库类型生成不同SQL,迁移性更好。

<?php
namespaceapp\controllers;

useYII;
useyii\db\Query;
useyii\web\Controller;

classTestControllerextendsController
{
publicfunctionactionTest()
{
//YII2的Query的使用
//Query与createCommand的区别是createCommand是直接写一个SQL来执行。
//Query是根据参数和数据库类型生成不同的SQL,提升数据库可迁移性。

//通过all查询多条记录
//我这里用tb_user表来进行演示
$data1=(newQuery())->select(['id','name'])
->from('{{%user}}')
->all();

//指定where条件查询
$data2=(newQuery())->select(['id','name'])
->from('{{%user}}')
->where('id=:id',[':id'=>'2'])
->all();

//通过one查询单条记录
$data3=(newQuery())->select(['id','name'])
->from('{{%user}}')
->where('id=3')
->one();

//判断记录是否存在
$exists=(newQuery())->from('{{%user}}')
->where('name="aaa"')
->exists();

if($exists){
echo'name=aaa存在';
}

//定义字段别名
//注意真实的字段名写后面,别名写前面
$data4=(newQuery())->select(['ids'=>'id','names'=>'name'])
->from('{{%user}}')
->where('1=1')
->all();

//通过orderby排序,和limit限制条数
$data5=(newQuery())->select(['id','name'])
->from('{{%user}}')
->where('1=1')
->orderBy('iddesc')
->limit(3)
->all();

//多个and条件
//参数是数组,一个key对应一个value,默认以and拼接
$data6=(newQuery())->select(['id','name'])
->from('{{%user}}')
->where(['id'=>3,'name'=>'aaa'])
->one();

//in条件
$data7=(newQuery())->select(['id','name'])
->from('{{%user}}')
->where(['id'=>[4,5,6]])
->all();

//或者如下方式
$data7_2=(newQuery())->select(['id','name'])
->from('{{%user}}')
->where(['in','id',[4,5,6]])
->all();

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

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

$data9=(newQuery())->select(['id','name'])
->from('{{%user}}')
->where(['<=','id',3])
->all();

//like查询
$data10=(newQuery())->select(['id','name'])
->from('{{%user}}')
->where(['like','name','dd'])
->all();

//between筛选和groupby分组
//查找出age在18到24之间的,并按sex分组
$data11=(newQuery())->select(['id','name'])
->from('{{%user}}')
->where(['between','age',18,24])
->groupBy('sex')
->all();

//having筛选
//按sex分组,然后统计人数大于3的
$data12=(newQuery())->select(['sex','cnt'=>'count(*)'])
->from('{{%user}}')
->groupBy('sex')
->having('cnt>3')
->all();

//or逻辑条件
//查找姓名为aaa或bbb的用户
//之前where数组是以key=>value方式传递的,如果要表达复杂逻辑关系,
//数组第一个元素必须声明是什么逻辑,and还是or
//第二个元素表示逻辑左边
//第三个元素表示逻辑右边
$data13=(newQuery())->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=(newQuery())->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=(newQuery())->select(['id','name'])
->from('{{%user}}')
->where([
'and',
['sex'=>1],
[
'or',
['like','name','aa'],
['like','name','bb'],
],
])
->all();

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

//追加or条件
$query2=(newQuery())->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`LEFTJOIN`tb_auth_assignment``aa`ONaa.user_id=u.id
$data16=(newQuery())->select(['u.id','u.name','aa.item_name'])
->from(['u'=>'{{%user}}'])
->leftJoin(['aa'=>'{{%auth_assignment}}'],'aa.user_id=u.id')
->all();
}
}

关于如何在YII2框架中使用Query()查询生成器就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

发布于 2021-03-21 22:38:15
收藏
分享
海报
0 条评论
162
上一篇:如何在Java中使用try-with-resource语句 下一篇:怎么在YII2框架中使用控制台命令
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码