关于thinkphp6 where以数组形式查询,其中有or,and的处理

hykeda8个月前ThinkPHP304

最近在写tp6的查询语句时,如果查询条件以数组形式传入,比如:

$where[] = ['id','=',$id];
$where[] = ['openid','=',$openid];
$where[] = ['mobile','=',$mobile];
$model->where($where)->find();

这样的写法,sql语句时用and相连的。但是现在如果需要有用到or的话,可以使用whereOr

但是如果是另个字段,同时等于一个值,并且是or,那么要这样写:

$where[] = ['openid|mobile','=',‘kkkkkkkkkkk’];

这样生成的sql是:id=1 and (openid=‘kkkkkkkkk’or mobile=‘kkkkkkkkk)。

但是现在我想要生成的sql是这样的:id=1 and (openid = 'asdfasdfasdfasdfasdf' or mobile='13333333333')。

以前用tp可以写成:

$where[] = [['openid','=',‘asdfasdfasdfasdfasdf’],['mobile','=',‘13333333333’],or];

但是现在这种写法tp6已经不支持了,现在必须用闭包的写法来实现:

新创建一个$map的变量:

$where[] = ['id','=',$id];
$map[] = ['openid','=',$openid];
$map[] = ['mobile','=',$mobile];
$model->where($where)->where(function($query) use ($map){
    $query->whereOr($map);
})->find();

这样写就能实现上面所说的sql语句

相关文章

Thinkphp6中在构造函数中返回json数据

return json($arr)->send();如果直接在构造函数中使用return json()是不会返回json格式的数据的。必须调用send方法。...

关于thinkphp5.1中间件的使用

关于thinkphp5.1中间件的使用

在tp5.1开始,有了中间件的概念。 首先中间件主要用于拦截或过滤应用的HTTP请求,并进行必要的业务处理。 生成中间件: php thin...

Thinkphp5 创建模块

一、创建三个模块 Common(公共模块),Index(前台模块),Admin(后台模块)。 index.php实际配置 <?php // 定义应用目录 define('APP_...

记录thinkphp3.13移植到php7过程

随着php7的兴起,越来越多的公司用php7了,下面记录一次thinkphp3.1.3项目移植到php7解决兼容性的过程。 先在thinkphp...

thinkphp5 导入第三方类库和导入扩展类库细节

在用到tp5之后,很多东西都不太一样了。在此记录些小经验: 类库的导入,tp5有两种类库,分别为第三方类库和扩展类库 导入扩展类库,tp的手册中有示例代码: extend目录下面...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。