tp6Day3--数据库查询

107 阅读2分钟

1.时间查询例子

public function timeQuery()
{
    //1.传统方式
    Db::name('user')->where('create_time','<','2018-1-1')->select();
    Db::name('user')->where('create_time','between',['2018-1-1','2018-1-31'])->select();

    //2.快捷方式
    Db::name('user')->whereTime('create_time','>=','2018-1-1')->select();
    Db::name('user')->whereBetween('create_time',['2018-1-1','2018-1-31'])->select();
    Db::name('user')->whereBetweenTime('create_time','2018-1-1','2018-1-31')->select();
    Db::name('user')->whereTime('create_time','2018-1-1')->select();//默认大于
    //3.固定查询
    //3.1 使用whereYear查询今年、去年、某一年的数据
    Db::name('user')->whereYear('create_time')->select();
    Db::name('user')->whereYear('create_time','last year')->select();
    Db::name('user')->whereYear('create_time','2018')->select();
    //3.2 使用whereMonth查询当月的数据、上月的数据和某一个月的数据
    Db::name('user')->whereMonth('create_time')->select();
    Db::name('user')->whereMonth('create_time','last month')->select();
    Db::name('user')->whereMonth('create_time','2018-6')->select();
    //3.3使用 whereDay 查询今天的数据、昨天的数据和某一个天的数据;
    Db::name('user')->whereDay('create_time')->select();
    Db::name('user')->whereDay('create_time','last day')->select();
    Db::name('user')->whereDay('create_time','2018-6-29')->select();

    //4.其他查询
    Db::name('user')->whereTime('create_time','-2 hours')->select();//查询指定时间的数据,比如两小时内的
    Db::name('user')->whereBetweenTimeField('start_time','end_time')->select();
}

2.聚合.原生.子查询

public function aggregateProgenyQueries()
{
    //1.聚合查询
    Db::name('user')->count();
    Db::name('user')->count('uid');
    Db::name('user')->max('price',false);
    Db::name('user')->mix('price');
    Db::name('user')->avg('price');
    Db::name('user')->sum('price');
    //2.子查询
    Db::name('user')->fetchSql(true)->select();//不执行sql返回sql语句
    Db::name('user')->buildSql(true);//不执行sql返回sql语句
    //2.1结合以上方法编写子查询
    $subQuery = Db::name('two')->field('uid')->where('gender','男')->buildSql(true);
    $result = Db::name('one')->where('id','exp','IN'.$subQuery)->select();
    //2.2闭包子查询
    Db::name('one')->where('id','in',function ($query){
        $query->name('two')->where('gender','男')->field('uid');
    });
    //3.原生查询
    //3.1原生sql查询
    Db::query("select * from user where id = (select id from user where id = 1)");//原生子查询
    //3.2 使用execute方法,进行原生sql更新写入等,SQL错误返回false
    Db::execute("update tp_user set username='周星驰' where id=29");
}

3.链式查询方法

public function chainQuery()
{
    //在 fieldRaw()方法里,可以直接给字段设置 MySQL 函数;
    Db::name('user')->fieldRaw('id,SUM(price)')->select();
    //使用 field(true)的布尔参数,可以显式的查询获取所有字段,而不是*;
    Db::name('user')->field(true)->select();
    // 使用 withoutField()方法中字段排除,可以屏蔽掉想要不显示的字段
    Db::name('user')->withoutField('details')->select();
    //使用 field()方法在新增时,验证字段的合法性
    Db::name('user')->field('username,email,details')->insert($data);
}
//page 1. page()分页方法,优化了 limit()方法,无须计算分页条数;
//第一页
Db::name('user')->page(1, 5)->select();
//第二页
Db::name('user')->page(2, 5)->select();

//order
//使用 order()方法,可以指定排序方式,没有指定第二参数,默认 asc;
Db::name('user')->order('id', 'desc')->select();
// 支持数组的方式,对多个字段进行排序
Db::name('user')->order(['create_time'=>'desc', 'price'=>'asc'])->select();
// 使用 orderRaw()方法,支持排序的时候指定 MySQL 函数;
Db::name('user')->orderRaw('FIELD(username,"樱桃小丸子") DESC')->select();

数据库的高级查询

image.png

public function advancedQuery()
{
    //如果,条件中有多次出现一个字段,并且需要 OR 来左右筛选,可以用 whereOr;
    $map1 = [ ['username', 'like', '%小%'], ['email', 'like', '%163%'] ];
    $map2 = [ ['username', 'like', '%孙%'], ['email', 'like', '%.com%'] ];
    Db::name('user')->whereOr([$map1, $map2])->select();
    //闭包查询
    Db::name('user')
        ->where(function ($query){
            $query->where('id','>',10);
        })->whereOr(function ($query){
            $query->where('username','like','%小%');
        })->select();
    //whereRaw()方式也支持参数绑定操作,具体如下
    $user = Db::name('user') ->whereRaw('(username LIKE :username AND email LIKE :email) OR (price > :price)', ['username'=>'%小%', 'email'=>'%163%', 'price'=>80]) ->select();
}

数据库的快捷查询

//快捷查询
public function fast()
{
    //whereColumn()方法,比较两个字段的值,符合的就筛选出来;
    $user = Db::name('user')
            ->whereColumn('update_time','>','create_time')
            ->select();
    //执行闭包里的分支查询
    $user = Db::name('user')
        ->when(false,function ($query){
            $query->where('id','>',0);
        },function ($query){
            $query->where('username','like','%小%');
        })->select()->toArray();

    //where快捷查询  whereFieldName()方法,查询某个字段的值,注意 FileName 是字段名
    Db::name('user')->whereEmail('xiaoxin@163.com')->find();
    Db::name('user')->whereUsername('蜡笔小新')->find();
    //getByFieldName()方法,查询某个字段的值,注意只能查询一条,不需要 find()
    Db::name('user')->getByEmail('xiaoxin@163.com');
    //getFieldByFieldName()方法,通过查询得到某个指定字段的单一值;
    Db::name('user')->getFieldByEmail('xiaoxin@163.com', 'username');
}