TP5.1中TP3.2的select()对应ArticleModel::all()或(new ArticleModel())->select(),find(123)对应ArticleModel::get(123);where()需显式指定表达式如where('status', '=', 1),getField()改value()或column(),getCount()改count(),join()须用AS显式声明别名。

TP3.2 的 select() 和 find() 在 TP5.1 里怎么对应
TP5.1 彻底移除了模型的 select() 和 find() 静态调用方式,直接调用会报 Fatal error: Call to undefined method。必须改用查询构造器或模型实例方法。
常见写法对比:
- TP3.2:
ArticleModel::select()→ TP5.1 改为(new ArticleModel())->select()或更推荐的ArticleModel::all() - TP3.2:
ArticleModel::find(123)→ TP5.1 改为ArticleModel::get(123)(主键查询)或ArticleModel::where('id', 123)->find() -
all()返回的是Collection对象,不是数组;需要转数组用->toArray()
TP3.2 的 where() 链式调用在 TP5.1 里要注意参数顺序
TP5.1 的 where() 默认是「字段、表达式、值」三元结构,和 TP3.2 的「字段、值」双参数习惯不兼容。不显式指定表达式时,TP5.1 会把第二个参数当表达式处理,极易出错。
- TP3.2:
->where('status', 1)->select()→ TP5.1 必须写成->where('status', '=', 1)或简写->where('status', 1)(仅当值非数组/闭包时才自动补=) - 模糊查询:
->where('title', 'like', '%关键词%'),不能漏掉'like' - 多条件数组写法保留:
->where(['status' => 1, 'type' => 'news'])是安全的 - 闭包查询写法一致,但内部也要按 TP5.1 规则写:
->where(function ($query) { $query->where('id', '>', 10)->where('status', 1); })
TP3.2 的 getField()、getCount() 等快捷方法没了
TP5.1 不再提供 getField()、getCount()、getOne() 这类快捷方法,全部归到查询构造器统一入口。
立即学习“PHP免费学习笔记(深入)”;
-
getField('name')→ 改用->value('name')(返回单个字段值)或->column('name')(返回字段值数组) -
getCount()→ 改用->count(),注意它返回的是 int,不是链式对象 -
getOne('id')→ 实际等价于->value('id'),但需确保只有一条结果,否则取第一条 - 如果原逻辑依赖
getField()的默认逗号分隔字符串,现在要自己implode(',', $model->column('name'))
连表查询和字段别名写法有隐性兼容问题
TP5.1 的 join() 默认开启 strict 模式,字段冲突时不会自动覆盖,且别名必须显式用 AS,否则解析失败。
- TP3.2:
->join('category c ON a.cid = c.id')->field('a.*, c.name as cname') - TP5.1 必须写成:
->join('category c', 'a.cid = c.id')->field('a.*, c.name AS cname')(AS大小写不敏感但不能省略) - 如果连表后查不到别名字段,先检查是否用了反引号(TP5.1 不支持反引号包裹别名),例如
c.name AS `cname`会报错 -
field()中若含函数如count(*),必须加别名:->field('count(*) AS total'),否则 TP5.1 无法识别
最易被忽略的是 where 条件中值为 null 或空数组时的行为变化:TP5.1 会直接跳过该条件,而 TP3.2 可能生成 IS NULL 或空 IN,升级后务必补全判空逻辑。



















