CodeIgniter4调用getFieldNames()报null成员函数错误求助
错误原因
- 你重写
UsersModel的构造方法时,没有调用父类Model的构造函数,CI4框架核心Model类原本会在自身构造方法中自动初始化数据库连接实例并赋值给$this->db属性,被自定义构造方法覆盖后该初始化逻辑没有执行。 - 构造方法中
\Config\Database::connect()返回的连接实例被赋值给了局部变量$db,并没有赋值给类属性$this->db,导致调用getColumns()方法时$this->db值为null,调用成员方法自然抛出空对象错误。
修复方法
推荐使用CI4模型的标准写法,不需要手动初始化数据库连接和查询构造器,只需要指定对应表名、重写构造时调用父类构造即可:
class UsersModel extends Model { // 指定模型绑定的表名,框架会自动完成连接、查询构造器初始化 protected $table = 'users'; public function __construct() { // 必须调用父类构造方法,执行核心初始化逻辑 parent::__construct(); } public function getColumns() { $names = $this->db->getFieldNames($this->table); foreach ($names as $field) { echo $field; } exit; } }
如果需要手动控制数据库连接,需要把连接实例赋值给$this->db类属性,不能只用局部变量存储:
class UsersModel extends Model { public function __construct() { // 将连接实例赋值给类属性$this->db $this->db = \Config\Database::connect(); $this->builder = $this->db->table('users'); } public function getColumns() { $names = $this->db->getFieldNames('users'); foreach ($names as $field) { echo $field; } exit; } }
注意:非特殊场景不推荐第二种手动连接的写法,CI4的Model已经封装了完整的表操作逻辑,手动初始化很容易遗漏属性赋值导致各类报错。
内容的提问来源于stack exchange,提问作者sana khalid
相关产品推荐
相关产品推荐

