在 yii2.0.45 中,应直接使用 activerecord 的 where + one() 或 all() 方法按 username 查询用户,避免原生 sql 和重复查询;需校验变量非空、确保字段唯一索引,并优先复用 yii::$app->user->identity 获取当前登录用户。

在 Yii2.0.45 中,获取指定用户名对应的数据,核心是使用 ActiveRecord 查询语法,结合 where 条件精准定位。不需要写原生 SQL,也不建议绕路查 ID 再查用户,直接按 username 字段查询最简洁高效。
用 where + one() 获取单个用户
适用于已知用户名(如表单提交、URL 参数传入),只需一条匹配记录的场景:
-
User::find()->where(['username' => 'admin'])->one();—— 返回 username 为 'admin' 的第一个 User 模型实例,未找到则返回 null - 确保
username字段有唯一索引,避免语义歧义;若业务允许多个同名用户,应明确是否需加其他条件(如 status = 1)
用 where + all() 获取所有同名用户
当系统允许用户名不唯一(比如支持昵称重复),或需批量处理时使用:
-
User::find()->where(['username' => 'testuser'])->all();—— 返回数组,含所有匹配的 User 对象 - 可链式追加
->orderBy('id DESC')或->limit(10)控制结果顺序与数量
安全查询:防 SQL 注入与空值处理
Yii2 自动参数绑定,但逻辑层仍需防御性判断:
- 先校验变量是否存在且非空:
if (!empty($username)) { ... } - 避免直接拼接字符串:
where("username = '$username') ❌,必须用数组语法或占位符 - 如需模糊匹配(如搜索含某字符的用户名):
->andWhere(['like', 'username', $keyword])
关联当前登录用户时不要重复查库
如果“指定用户名”就是当前已登录用户,千万别再查数据库:
- 正确方式:
$user = Yii::$app->user->identity;,然后$user->username即可 - 错误方式:
User::findOne(Yii::$app->user->id)或User::find()->where(['username' => Yii::$app->user->identity->username])->one()—— 多余且低效











