CodeIgniter 4 Model无法获取记录:RESTful API开发中SQL语法错误排查
解决CodeIgniter 4中findAll()触发的SQL语法错误
这个问题我之前在CI4开发时也碰到过,从报错信息和你的代码来看,大概率是你的PlacesModel启用了软删除功能,但数据表缺少对应的字段导致的,跟你写的orderBy和findAll代码本身没关系。
为什么会出现这个错误?
CodeIgniter 4的Model有个$useSoftDeletes属性,当你把它设为true时,框架会自动给所有查询加上WHERE deleted_at IS NULL的条件(默认软删除字段是deleted_at)。但如果你的places数据表根本没有deleted_at这个字段,生成的SQL就会变成类似这样:
SELECT * FROM `places` WHERE IS NULL ORDER BY `id` DESC
这就直接触发了SQL语法错误,也就是你看到的near 'IS NULL ORDER BY id DESC'的报错。
排查和解决步骤
1. 检查你的PlacesModel配置
打开你的PlacesModel.php,看看有没有这一行:
protected $useSoftDeletes = true;
如果有,那就是问题根源了。
2. 选择适合你的解决方式
方式一:不需要软删除?直接关闭它
如果你的业务不需要软删除功能,直接把这行代码注释掉或者改成false即可:
class PlacesModel extends Model { protected $table = 'places'; protected $primaryKey = 'id'; // 注释或修改这一行 // protected $useSoftDeletes = true; protected $allowedFields = ['name', 'address', ...]; // 你的字段列表 }
方式二:需要软删除?给数据表加对应字段
如果确实需要软删除功能,那得给places表添加deleted_at字段,执行下面的SQL语句:
ALTER TABLE places ADD COLUMN deleted_at DATETIME NULL;
要是你想自定义软删除的字段名,还可以在Model里设置$deletedField属性:
protected $deletedField = 'my_custom_deleted_column';
3. 额外排查:检查Model的$where属性
如果上面的方法没解决问题,再看看Model里有没有错误设置的$where属性,比如不小心写了protected $where = [''];,这种空条件也会导致生成错误的SQL语句。
修改完后重新运行你的API,应该就能正常获取数据了。
内容的提问来源于stack exchange,提问作者Rahul Gupta
相关产品推荐
相关产品推荐

