最稳妥的方式是用 get() 配合 limit(1),它明确取一条、生成 limit 1 sql、效率高;仅用 row() 而不加 limit(1) 会导致全表扫描。

用 get() 配合 limit(1) 最稳妥
CodeIgniter 3 和 4 都支持这个组合,它明确表达“只取一条”,且不会因后续调用 result() 或 row() 而产生歧义。数据库层真正执行的是带 LIMIT 1 的 SQL,效率有保障。
常见错误是只写 row() 却没加 limit(1)——这会让 CI 先查全表再取第一行,数据量大时很伤性能。
$this->db->select('*')->from('users')->where('id', 5)->limit(1)->get()->row();- 返回对象(
stdClass),字段可直接用$user->name - 若无匹配记录,返回
NULL,不是空对象
row() 和 row_array() 的区别在哪
两者都只取结果集第一行,但返回类型不同:前者是对象,后者是关联数组。关键点在于——它们**不自动加 LIMIT**,只是 PHP 层截取。
这意味着如果你没手动 limit(1),查询语句仍是 SELECT * FROM users WHERE status = 1,可能扫描上万行才取第一个。
- 用
row():适合习惯对象访问、且已确保limit(1)已调用 - 用
row_array():适合要isset($row['email'])这类数组判断的场景 - CI 4 中对应方法是
getRow()和getRowArray(),行为一致
CI 4 的 find() 方法能直接查单条吗
可以,但仅限主键查询,且必须是整数 ID。这是 CI 4 Model 层的快捷方式,底层自动拼 WHERE id = ? 并加 LIMIT 1。
它不能用于其他字段(比如 find('admin') 查 username)——会报错或返回 null,容易误用。
$user = $this->UserModel->find(123); // ✅ 正确,查主键$user = $this->UserModel->find('admin'); // ❌ 不起作用,返回 NULL- 想按其他字段查单条,仍得走
where()->limit(1)->first()
为什么有时 row() 返回 false 而不是 null
这通常发生在查询失败时,比如数据库连接中断、表不存在、SQL 语法错误。CI 3 默认不抛异常,而是让 get() 返回 false,后续调用 row() 就会报 “Call to a member function row() on bool” 错误。
真正该检查的是 get() 的返回值,而不是盲目链式调用:
- 加一层判断:
$query = $this->db->get(); if ($query) { return $query->row(); } - CI 4 可开启异常模式,在
app/Config/Database.php中设'DBDebug' => true - 生产环境建议统一用
try/catch包裹查询逻辑
最易被忽略的是:即使你写了 limit(1),如果 where() 条件本身没命中任何数据,row() 依然返回 NULL——这不是 bug,是预期行为。业务代码里别忘了判空。











