📅  最后修改于: 2023-12-03 14:51:43.859000             🧑  作者: Mango
CodeIgniter (CI) 是 PHP 的一种轻量级开发框架,其所提供的 Model 类提供了丰富的查询操作接口,开发者可以方便地进行数据库查询操作。在进行一些高级的查询时,开发者可能需要设置 sql_mode 才能正确执行查询,本文将介绍如何在 CI 模型中设置 sql_mode。
在 CodeIgniter 的数据库配置文件 database.php
中,我们可以添加一个 db_debug
的配置项,该配置项可以打开或关闭调试模式,以方便我们查看最后执行的 SQL 语句。
$db['default'] = array(
...
'db_debug' => TRUE,
...
);
当我们在执行查询操作时,可以通过 $this->db->last_query()
方法获取最近一次查询的 SQL 语句。例如:
$query = $this->db->select('*')
->from('user')
->get();
echo $this->db->last_query();
执行结果为:
SELECT * FROM user
现在我们有一个需求:要对 user 表进行分组查询,并且要在分组查询时对空值进行统计。但是在 MySQL 5.7 以后,如果表不使用任何聚合函数进行查询时,会自动忽略 NULL 值。因此我们需要设置 sql_mode:
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
SELECT COUNT(*) FROM (
SELECT COUNT(*) FROM user GROUP BY age
) AS t;
如果我们直接在 CI 中使用:
$result = $this->db->query("SELECT COUNT(*) FROM (SELECT COUNT(*) FROM user GROUP BY age) AS t");
会返回错误提示:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.user.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
此时需要在 CI 中设置 sql_mode:
$this->db->query("SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'");
$result = $this->db->query("SELECT COUNT(*) FROM (SELECT COUNT(*) FROM user GROUP BY age) AS t");
此时即可正确执行查询,返回结果为:
1
说明了我们所查询的分组中,有 1 个空值。
通过以上介绍,我们可以知道如何在 CI 模型中设置 sql_mode。在进行数据库查询操作时,我们需要充分考虑所需 sql_mode 配置,以避免查询异常或错误的结果。