添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

thinkphp框架的Db类支持数组批量查询,如通过两个字段来查询(status和catid),我们可以这样写查询语句:

$map['status'] = 1;
$map['catid'] = 1;
Db::name('posts')->where($map)->select();

最终生成的sql语句是(假设数据表前缀为jp_,下同):

SELECT * FROM `jp_posts` WHERE `status` = 1 AND `catid`=1

这在thinkphp5和tinkphp6中中的效果是一样的,除了相当之外,还可以支持其他的表达式,比如查询status=1,标题符合关键词模糊查询的数据。

$map['status'] = 1;
$map['title'] = ['like','%关键词%'];
Db::name('posts')->where($map)->select();

在thinkphp5中可以得到我们预期所需要的sql语句:

SELECT * FROM `jp_posts` WHERE `status` = 1 AND `title` LIKE '%关键词%'

但在thinkphp6中使用上述写法最终生成的sql语句是:

SELECT * FROM `jp_posts` WHERE  `status` = 1  AND `title` IN ('like','%关键词%')

很显然跟我们预期所需要的sql语句是不一样的,原因在于新的tinkphp6在进行组装原始sql语句的时候有所调整,如果是原来其他表达式的一律当做IN子句来处理。在thinkphp6中如果需要使用其他表达式组合查询,应该使用如下这样的语法:

$map[] = ['status','=',1];
$map[] = ['title','like','%关键词%']; 
Db::name('posts')->where($map)->select();

这样就可以生成我们预期所需要的sql语句了:

SELECT * FROM `jp_posts` WHERE `status` = 1 AND `title` LIKE '%关键词%'

笔者个人还是比较习惯使用上面map[key]这种形式的写法,你觉得哪种写法更适合呢?

  • thinkphp6 session过一段时间自动失效的原因分析
  • thinkphp6使用invoke或app代替action实现调用控制器方法
  • thinkphp6中insert方法不返回自增ID?数据库操作变动之insert
  • 详解Discuz会员认证信息的数据库保存及获取
  • thinkphp6模板中输出的html被转义的解决方案
  • max_allowed_packet值太小导致mysql导入数据出现[Err] 2006 – MySQL server has gone away
  •