📜  如何为 CI 模型中的查询设置 sql_mode - SQL (1)

📅  最后修改于: 2023-12-03 14:51:43.859000             🧑  作者: Mango

如何为 CI 模型中的查询设置 sql_mode - SQL

简介

CodeIgniter (CI) 是 PHP 的一种轻量级开发框架,其所提供的 Model 类提供了丰富的查询操作接口,开发者可以方便地进行数据库查询操作。在进行一些高级的查询时,开发者可能需要设置 sql_mode 才能正确执行查询,本文将介绍如何在 CI 模型中设置 sql_mode。

设置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 配置,以避免查询异常或错误的结果。