- $where = [];
- // 1. 使用了关联键名赋值
- if (!empty($param['bid'])) {
- $where['bid'] = intval($param['bid']);
- }
- // 2. 压入闭包处理 OR 查询
- if (!empty($param['keyword'])) {
- $keyword = trim($param['keyword']);
- $where[] = function($query) use ($keyword) {
- $query->where('name', 'like', '%' . $keyword . '%')
- ->whereOr('description', 'like', '%' . $keyword . '%');
- };
- }
- $list = $this->typeModel->lists($where, $page, $limit);
这么写如果只查询bid或者只输入关键词是正常的,没有任何报错,但是如果两个同时出现就会出现报错
他竟然会报表不存在的错误,这就很奇怪了,因为你就是去问AI,他大概也是推荐你这么写的。
- SQLSTATE[42S02]: Base table or view not found: 1146 Table 'ts_' doesn't exist
原因是,如果两个同时出现 上面的where就会变成:
ThinkPHP 5.1 在解析条件数组时,如果遇到非纯索引数组,底层遍历逻辑会把索引 0 误识别为一个名为 '0' 的数据库字段,在生成 COUNT() 语句时拼出如 WHERE 0 IN (?,?) 类的畸形 SQL,引发 1064 Syntax error。所以正确写法是:
- [
- 'bid' => 1,
- 0 => Closure
- ]
也就是其他参数传参的时候 必须写成数组形式:
- $where = [];
- // 1. 数组项必须采用官方规范的三元组格式 ['字段', '表达式', '值']
- if (!empty($param['bid'])) {
- $where[] = ['bid', '=', intval($param['bid'])];
- }
- // 2. 闭包作为数组元素压入,TP 内部会自动转换成带有括号 () 的子条件
- if (!empty($param['keyword'])) {
- $keyword = trim($param['keyword']);
- $where[] = function ($query) use ($keyword) {
- $query->where('name', 'like', '%' . $keyword . '%')
- ->whereOr('description', 'like', '%' . $keyword . '%');
- };
- }
$where['field'] = val 和 $where[] = [...]这两种写法是不一样的,
- $where[] = ['bid', '=', intval($param['bid'])];




















文章点评