You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 00:27:29