TP6高级查询,thinkphp执行原生语句

平时使用模型都对一些简单条件做判断(判断值是否相等之类的),然后,今天在遇到一个复杂SQL语句的时候栽了。where()突然就不会用了
复杂语句里包含了 判 null,AND条件,OR条件,in条件,like条件

根据手册,一般情况下我们在使用条件查询的时候,会做如下的操作

//$model = new Model()
$model = Model::where(条件)->select()->toArray();
$model = Model::where('name','张三')->select()->toArray();
$model = Model::where('age','in',['21','20','19']])->select()->toArray();
$model = Model::where('address','like','%'.'深圳'.'%')->select()->toArray();

那么问题来了,观察上面的语句不难发现每一条查询都是简单条件的查询,如果遇到一个业务的查询条件需要使用到以上的所有条件呢?
有如下解决方法。
通过TP6模型的where()方法的源码不难发现,where的第一个参数可以是字符串(string)也可以是数组(array),并且是数组的时候是支持多条件查询的。

举个简单的例子

$model = Model::where(['name' => '张三'])->select()->toArray();
// 等同于
$model = Model::where('name','张三')->select()->toArray();

因此便有了以下的骚操作,我们可以将所有的条件组合成一个数组去使用 ,一样可以查出我们想要的结果!

$queryArr = [
    'name' => '张三',
    'age' => ['in','21','22','23'],
    'address' => ['like','深圳'],
];
$model = Model::where($queryArr)->select()->toArray();

但是呢,发现没有!上面的操作转换成sql语句之后其实都是用AND链接的。如果要用到OR或者判空的时候怎么办呢?

手册中有提供到这样的用法。判 null

Db::name('user')->where('name', null)
->where('email','null')
->where('name','not null')
->select();

‘OR’ 查询()

$map1 = [
        ['name', 'like', 'thinkphp%'],
        ['title', 'like', '%thinkphp'],
    ];
    
$map2 = [
        ['name', 'like', 'kancloud%'],
        ['title', 'like', '%kancloud'],
    ];    
    
Db::table('think_user')
    ->whereOr([ $map1, $map2 ])
    ->select();

可以,看起来非常好用的样子,但是博主用起来的时候,一直在报错,弄得我心烦气躁。哼?垃圾东西,捣鼓框架怎么去实现这些鬼东西的时间都够我直接用原生sql语句撸出结果来了。!!!

emmm,想起来where()方法的第一个参数是可以放查询字符串的,那,,我直接把原生SQL语句丢里面会怎么样?

$data = Model::where(" name = '张三' AND balabala OR bala ")->select()->toArray();

没想到成功了!!!!!哈哈哈我滴神。
回头看了一下源码,好家伙,原来确实有提供这样的方法给我们使用,只是博主眼瞎了没有发现到。
emmm,TP6,牛皮。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值