高级查询
使用|(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();