【ThinkPHP6.x框架】(7)数据库进阶3(高级查询与便捷查询)

 高级查询

        使用|(OR)或&(AND)来实现  where条件的高级查询,where支持多个连缀;

$user = Db::name('user')
        ->where('username|email', 'like', '%xiao%') 
        ->where('price&uid', '>', 0)
        ->select();

        对应的sql语句如下: 

SELECT * FROM `tp_user` WHERE ( `username` LIKE '%xiao%' OR `email` LIKE '%xiao%' ) AND ( `price` > 0 AND `uid` > 0 )

        也可以使用关联数组的方式来对查询条件进行判定;

$user = Db::name('user')->where([
                        ['id', '>', 0],
                        ['status', '=', 1], 
                        ['price', '>=', 80], 
                        ['email', 'like', '%163%']
                        ])->select();

        对应的sql语句如下:

SELECT * FROM `tp_user` WHERE `id` > 0 AND `status` = 1 AND `price` >= 80 AND `email` LIKE '%163%'

        如果使用了函数exp,则需要使用raw函数来对其进行包装;

$user = Db::name('user')->where([
                        ['status', '=', 1],
                        ['price', 'exp', Db::raw('>80')] ])->select();

        对应的sql语句如下:

SELECT * FROM `tp_user` WHERE `status` = 1 AND ( `price` >80 )

        如果,条件中有多次出现一个字段,并且需要  OR来左右筛选,可以用  whereOr;

$map1 = [
        ['username', 'like', '%小%'], 
        ['email', 'like', '%163%']
];
$map2 = [
        ['username', 'like', '%孙%'], 
        ['email', 'like', '%.com%']
];
$user = Db::name('user')->whereOr([$map1, $map2])->select();

        对应的sql语句如下:

SELECT * FROM `tp_user` WHERE ( `username` LIKE '%小%' AND `email` LIKE '%163%' ) OR ( `username` LIKE '%孙%' AND `email` LIKE '%.com%' )

        闭包查询可以连缀,会自动加上括号,更清晰,如果是OR,请用whereOR();

$user = Db::name('user')->where(function ($query) {
    $query->where('id', '>', 10); 
})->whereOr(function ($query) {
    $query->where('username', 'like', '%小%'); 
})->select();

        简单粗暴的方式:对于比较复杂或你不知道如何拼装  SQL条件,那么就直接使用  whereRaw()即可;

$user = Db::name('user')
    ->whereRaw('(username LIKE "%小%" AND email LIKE "%163%") OR (price > 80)') 
    ->select();

        whereRaw()方式也支持参数绑定操作,具体如下;

$user = Db::name('user')
->whereRaw('(username LIKE :username AND email LIKE :email) OR (price > :price)',
            ['username'=>'%小%', 'email'=>'%163%', 'price'=>80])
->select();

便捷查询

        系统封装了很多  where方法的快捷方式,之前学习了一些,全部如下:

         下面举一个例子:whereColumn()方法,比较两个字段的值,符合的就筛选出来;

$user = Db::name('user')->whereColumn('update_time', '>=', 'create_time')->select();

         系统还针对字段查询提供了几个方便查询的快捷方式;

        whereFieldName()方法,查询某个字段的值,注意  FileName是字段名;

Db::name('user')->whereEmail('xiaoxin@163.com')->find();
Db::name('user')->whereUsername('蜡笔小新')->find();
//如果字段是  create_time,则 whereCreateTime,驼峰式写法;

        getByFieldName()方法,查询某个字段的值,注意只能查询一条,不需要  find();

Db::name('user')->getByEmail('xiaoxin@163.com');

        getFieldByFieldName()方法,通过查询得到某个指定字段的单一值;

Db::name('user')->getFieldByEmail('xiaoxin@163.com', 'username');

补充

        when()可以通过条件判断,执行闭包里的分支查询;

$user = Db::name('user')->when(false, function ($query) { 
    $query->where('id', '>', 0);
}, function ($query) {
    $query->where('username', 'like', '%小%'); 
})->select();

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值