如何使用CodeIgniter Database Forge判断数据表是否存在多个指定列
CodeIgniter DB Forge 列存在性校验实现方案
完全可以通过CodeIgniter的相关功能实现该需求,避免迁移脚本执行时出现重复列错误。
核心实现逻辑
CodeIgniter的数据库类自带field_exists()(CI3)/fieldExists()(CI4)方法,可直接检测指定数据表中是否存在目标列,无需手动编写原生SQL查询。检测确认列不存在后,再调用DB Forge的加列方法即可。
迁移脚本示例
CI3 版本示例
<?php class Migration_Add_new_column extends CI_Migration { public function up() { // 第一个参数为待检测列名,第二个参数为目标表名 if (!$this->db->field_exists('user_phone', 'users')) { // 列不存在时才执行加列操作 $fields = [ 'user_phone' => [ 'type' => 'VARCHAR', 'constraint' => 20, 'null' => TRUE, 'default' => NULL ] ]; $this->dbforge->add_column('users', $fields); } } public function down() { // 回滚时也可以先做存在性校验,避免删除不存在的列报错 if ($this->db->field_exists('user_phone', 'users')) { $this->dbforge->drop_column('users', 'user_phone'); } } }
CI4 版本示例
<?php namespace App\Database\Migrations; use CodeIgniter\Database\Migration; class AddNewColumn extends Migration { public function up() { // 检测列是否存在 if (!$this->db->fieldExists('user_phone', 'users')) { $fields = [ 'user_phone' => [ 'type' => 'VARCHAR', 'constraint' => 20, 'null' => true, 'default' => null ] ]; $this->forge->addColumn('users', $fields); } } public function down() { if ($this->db->fieldExists('user_phone', 'users')) { $this->forge->dropColumn('users', 'user_phone'); } } }
注意事项
- 该方法支持所有CodeIgniter兼容的数据库类型(MySQL、PostgreSQL、SQLite等),不需要做额外的数据库适配。
- 除了加列场景外,修改列、删除列操作都可以先做存在性校验,避免迁移执行报错。
内容的提问来源于stack exchange,提问作者Bijay Shrestha
相关产品推荐
相关产品推荐

