當您運行Console\cake schema create
時,CakePHP設置MySQL SQL模式的方式是什麼?在CakePHP Schema中設置sql_mode
非CakePHP的當量使用的PDO::MYSQL_ATTR_INIT_COMMAND
參數運行在PDO構造這個查詢:
SET @@SESSION.sql_mode='TRADITIONAL,NO_AUTO_VALUE_ON_ZERO';
當您運行Console\cake schema create
時,CakePHP設置MySQL SQL模式的方式是什麼?在CakePHP Schema中設置sql_mode
非CakePHP的當量使用的PDO::MYSQL_ATTR_INIT_COMMAND
參數運行在PDO構造這個查詢:
SET @@SESSION.sql_mode='TRADITIONAL,NO_AUTO_VALUE_ON_ZERO';
您可以創建/編輯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=''
更概括地說,你可以(我建議你這樣做)在全球範圍更改SQL模式通過編輯DATABASE_CONFIG
類的相應屬性在app/Config/database.php
整個連接:
class DATABASE_CONFIG {
public $default = array(
'datasource' => 'Database/Mysql',
// …
'settings' => array(
'@@SESSION.sql_mode' => "'TRADITIONAL,NO_AUTO_VALUE_ON_ZERO'",
),
);
}
可以配置DB源。
$config['flags'] = [
PDO::MYSQL_ATTR_INIT_COMMAND] => "SET @@SESSION.sql_mode='TRADITIONAL,NO_AUTO_VALUE_ON_ZERO';"
];
See the connect() methods code的mysql驅動類。
但是,當你在同一時間使用$config['encoding']
這可能是一個問題...查看線路163 :(這迫切需要在覈心的修正。
但是你可以繼承這個類(MysqlExtended什麼像這樣),並根據需要進行更改並使用它。只需重載connect()方法。然後使用此驅動程序代替原來的連接。
對於CakePHP的3應用程序。 php,section'Datasources',add:
'flags' => [
PDO::MYSQL_ATTR_INIT_COMMAND => "SET @@SESSION.sql_mode='STRICT_ALL_TABLES,NO_ENGINE_SUBSTITUTION';"
]
謝謝。我想這已經被CakePHP 3重寫了,但是我很久以來會被困在2.x中。無論如何,你認爲可以從'AppSchema'運行查詢嗎?我一直在玩'before()'鉤子和'ConnectionManager :: getDataSource($ this-> connection) - > fetchAll()',但我無法得到正確的細節。 –
哦,忘記我評論的最後部分。這個項目(不是由我開始的)實際上有三個不同的'AppSchema'。我正在測試錯誤的。 –
就像我說的,只需擴展驅動程序類併爲它建立一個數據庫連接配置即可。然後在模式中使用它,請參閱:http://api.cakephp.org/2.5/source-class-CakeSchema.html# 如果您只想運行查詢,則可以使用Model :: query()或DboSource ::執行()。 – burzum