2015-01-08 73 views
0

當您運行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'; 

回答

1

您可以創建/編輯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'", 
     ), 
    ); 
} 
2

可以配置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()方法。然後使用此驅動程序代替原來的連接。

+0

謝謝。我想這已經被CakePHP 3重寫了,但是我很久以來會被困在2.x中。無論如何,你認爲可以從'AppSchema'運行查詢嗎?我一直在玩'before()'鉤子和'ConnectionManager :: getDataSource($ this-> connection) - > fetchAll()',但我無法得到正確的細節。 –

+0

哦,忘記我評論的最後部分。這個項目(不是由我開始的)實際上有三個不同的'AppSchema'。我正在測試錯誤的。 –

+1

就像我說的,只需擴展驅動程序類併爲它建立一個數據庫連接配置即可。然後在模式中使用它,請參閱:http://api.cakephp.org/2.5/source-class-CakeSchema.html# 如果您只想運行查詢,則可以使用Model :: query()或DboSource ::執行()。 – burzum

0

對於CakePHP的3應用程序。 php,section'Datasources',add:

'flags' => [ 
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET @@SESSION.sql_mode='STRICT_ALL_TABLES,NO_ENGINE_SUBSTITUTION';" 
]