当你
运行Console'cake schema create
时,CakePHP设置MySQL的SQL模式的方法是什么?
非 CakePHP 等效项是使用 PDO::MYSQL_ATTR_INIT_COMMAND
参数在 PDO 构造函数中运行此查询:
SET @@SESSION.sql_mode='TRADITIONAL,NO_AUTO_VALUE_ON_ZERO';
您可以配置数据库源。
$config['flags'] = [
PDO::MYSQL_ATTR_INIT_COMMAND => "SET @@SESSION.sql_mode='TRADITIONAL,NO_AUTO_VALUE_ON_ZERO';"
];
请参阅 MySQL 驱动程序类的 connect() 方法代码。
但是当您同时使用$config['encoding']
时,这可能是一个问题......请参阅第 163 行。:(这要求核心修复。
但是你可以扩展这个类(MysqlExtended 或类似的东西)并根据需要更改它并使用它。只需重载 connect() 方法即可。然后使用此驱动程序而不是原始驱动程序进行连接。
您可以创建/编辑AppSchema
构造函数(请注意,项目中可能有多个实例),获取数据源并执行查询:
class AppSchema extends CakeSchema {
public function __construct($options = array()) {
$db = ConnectionManager::getDataSource($this->connection);
$db->execute("SET @@SESSION.sql_mode='TRADITIONAL,NO_AUTO_VALUE_ON_ZERO'");
parent::__construct($options);
}
}
这将使用所需的 SQL 模式加载架构。更具体地说,它不会对应用程序本身强制实施给定的 SQL 模式。
可能的用例:
严格要求及早检测错误
SET @@SESSION.sql_mode='TRADITIONAL,NO_AUTO_VALUE_ON_ZERO'
放宽设置以加载不完整的示例数据
SET @@SESSION.sql_mode=''
更一般地说,您可以通过在 app/Config/database.php
编辑 DATABASE_CONFIG
类中的相应属性来全局更改整个连接的 SQL 模式:
class DATABASE_CONFIG {
public $default = array(
'datasource' => 'Database/Mysql',
// …
'settings' => array(
'@@SESSION.sql_mode' => "'TRADITIONAL,NO_AUTO_VALUE_ON_ZERO'",
),
);
}
对于 app.php 中的 CakePHP 3,"数据源"部分,添加:
'flags' => [
PDO::MYSQL_ATTR_INIT_COMMAND => "SET @@SESSION.sql_mode='STRICT_ALL_TABLES,NO_ENGINE_SUBSTITUTION';"
]