[英]How do I set a MysQL variable (time_zone) from within doctrine / symfony?
我想知道如何從 Symfony/Doctrine 中將 MySQL 時區設置為 UTC( SET time_zone = 'UTC'
),所以當我在查詢中的DATETIME
字段上調用UNIX_TIMESTAMP()
function 時,它返回 UTC unix 時間而不是服務器時區中的 unix 時間。
我該如何做到這一點,無論是在每次連接時自動執行,還是在時區有所不同的這些類型的查詢之前手動執行?
順便說一句,我需要在 MySQL 查詢而不是應用程序中進行此轉換,因此我可以GROUP BY
需要紀元時間的間隔進行分組。
您可以通過在ProjectConfiguration`中調用的configureDoctrineConnection
回調來執行此操作:
public function configureDoctrineConnection(Doctrine_Connection $connection)
{
$connection->exec('SET time_zone = "UTC"');
}
如果您使用多個連接,則可能存在問題。
(答案經過修改,刪除了有缺陷的其他方法。)
我將嘗試編輯projectConfiguration,並添加類似(未經測試和未經驗證)的內容:
$databaseManager = new sfDatabaseManager($this->configuration);
$connection = $databaseManager->getDatabase($options['connection'])->getConnection();
$diff = $connection->execute("SET time_zone = 'UTC'");
注意, $options
和$this->configuration
僅在任務中可用,因此也許應該對其進行硬編碼(我相信默認值為'doctrine'
)。
如果要在Symfony應用程序級別執行此操作,則可以將其添加到config/settings.yml
all:
.settings:
default_culture: en_US
default_timezone: Asia/Kolkata
很抱歉,答案不是在MySQL上,而是在Oracle DB上 。 我在Oracle DB上搜索了很長時間的數據,但一無所獲。 這是唯一也討論該問題的主題,但僅限於MySQL。
也許有人會為Oracle DB提供幫助:
在文件config/services.yaml
對於Symofony 4:
services:
Doctrine\DBAL\Event\Listeners\OracleSessionInit:
arguments:
- TIME_ZONE: 'UTC'
tags:
- { name: doctrine.event_listener, event: postConnect }
對於Symfony 2和3:
services:
oci8.listener:
class: Doctrine\DBAL\Event\Listeners\OracleSessionInit
arguments:
- TIME_ZONE: 'UTC'
tags:
- { name: doctrine.event_listener, event: postConnect }
或者,您可以將arguments對象寫入yaml中,如下所示:
arguments: { TIME_ZONE: 'UTC' }
對於 MySQL 8 和 Symfony 5,您可以將以下內容添加到config/services.yaml
services:
Doctrine\DBAL\Event\Listeners\SQLSessionInit:
arguments:
- 'SET TIME_ZONE="+04:00"'
tags:
- { name: doctrine.event_listener, event: postConnect }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.