平时使用模型都对一些简单条件做判断(判断值是否相等之类的),然后,今天在遇到一个复杂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,牛皮。