在 CakePHP Schema 中设置 sql_mode
Set sql_mode in CakePHP Schema
运行 Console\cake schema create
时设置 MySQL 的 SQL 模式的 CakePHP 方法是什么?
非 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';"
];
See the connect() methods code MySQL 驱动程序 class。
但是,当您同时使用 $config['encoding']
时,这可能会成为一个问题...请参阅第 163 行。:( 这需要在核心中进行修复。
但您可以扩展此 class(MysqlExtended 或类似的东西)并根据需要更改它并使用它。只需重载 connect() 方法即可。然后使用此驱动程序代替原始驱动程序进行连接。
您可以 create/edit 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=''
更笼统地说,您可以(我建议您这样做)通过在 DATABASE_CONFIG
class 在 app/Config/database.php
:
class DATABASE_CONFIG {
public $default = array(
'datasource' => 'Database/Mysql',
// …
'settings' => array(
'@@SESSION.sql_mode' => "'TRADITIONAL,NO_AUTO_VALUE_ON_ZERO'",
),
);
}
对于 app.php 中的 CakePHP 3,第 'Datasources' 部分,添加:
'flags' => [
PDO::MYSQL_ATTR_INIT_COMMAND => "SET @@SESSION.sql_mode='STRICT_ALL_TABLES,NO_ENGINE_SUBSTITUTION';"
]
运行 Console\cake schema create
时设置 MySQL 的 SQL 模式的 CakePHP 方法是什么?
非 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';"
];
See the connect() methods code MySQL 驱动程序 class。
但是,当您同时使用 $config['encoding']
时,这可能会成为一个问题...请参阅第 163 行。:( 这需要在核心中进行修复。
但您可以扩展此 class(MysqlExtended 或类似的东西)并根据需要更改它并使用它。只需重载 connect() 方法即可。然后使用此驱动程序代替原始驱动程序进行连接。
您可以 create/edit 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=''
更笼统地说,您可以(我建议您这样做)通过在 DATABASE_CONFIG
class 在 app/Config/database.php
:
class DATABASE_CONFIG {
public $default = array(
'datasource' => 'Database/Mysql',
// …
'settings' => array(
'@@SESSION.sql_mode' => "'TRADITIONAL,NO_AUTO_VALUE_ON_ZERO'",
),
);
}
对于 app.php 中的 CakePHP 3,第 'Datasources' 部分,添加:
'flags' => [
PDO::MYSQL_ATTR_INIT_COMMAND => "SET @@SESSION.sql_mode='STRICT_ALL_TABLES,NO_ENGINE_SUBSTITUTION';"
]