升级yii模型查询需替换废弃方法:将findall()等改为find()->where()->all(),重写scopes为静态方法,修正count返回类型,并适配yii 3.x的queryinterface变更。

将Yii框架中的模型查询从旧版本(如Yii 1.1或早期Yii 2.x)升级到新版本(Yii 2.0.40+或Yii 3.x),需调整查询语法、废弃方法调用及数据库抽象层行为,否则查询结果异常或直接报错。
检查并替换已废弃的查询方法
第一步:全局搜索项目中所有 findAll()、find()、findBySql() 等静态方法调用,这些在Yii 2.0.40后已被移除或仅保留兼容层但不再推荐使用。
第二步:将 User::model()->findAll($criteria) 替换为 User::find()->where($condition)->all(),注意 【$criteria 必须手动转换为 where 支持的数组或字符串格式,原 CDbCriteria 对象无法直传】。
第三步:若曾用 with() 加载关联并依赖返回对象的 getRelated() 行为,需确认关联定义是否已按新规范重写——旧版 relations() 数组方式在Yii 2+中完全失效,必须改用 getXXX() 方法加 via()/viaTable() 声明。
重写作用域(scopes)定义方式
方法一:Yii 2.0+ 中作用域必须定义为 public static function,且返回 $this(ActiveQuery 实例),不能返回数组或布尔值。
方法二:旧版写法 public function scopes() { return ['active' => 'status=1']; } 必须删除,改为在 UserQuery 类中定义:public function active() { return $this->andWhere(['status' => 1]); }。这一步不做会导致调用 User::find()->active()->all() 时抛出 Call to undefined method 错误。
处理 COUNT 查询的返回值变更
Yii 2.0.39 起,count() 默认返回 int 类型,而旧版可能返回字符串数字或带键数组。若代码中存在类似 if ($query->count() > 0) 且依赖字符串比较逻辑,需立即校验类型——【某些 MySQL 驱动下 count() 在空结果时返回 0,但旧版可能返回 null,升级后 null 情况消失】。
直接使用 $query->count() 即可,无需再套 (int) 强转,除非你主动启用了 QueryBuilder::$defaultIntType = false。
适配 Yii 3.x 的 QueryInterface 变更
① 将所有 yii\db\ActiveRecord::find() 替换为 yii\db\ActiveQuery::create(User::class) 或直接 new UserQuery();
② 删除所有对 createCommand() 返回值的链式调用假设——Yii 3.x 中 createCommand() 返回的是 Command 实例,不再自动支持 select()、where() 等 ActiveQuery 方法;
③ 关联查询必须显式调用 joinWith() 并传入关系名字符串或闭包,with() 已被弃用且不触发 JOIN,仅做懒加载。











