如何在doctrine / symfony中设置MysQL变量(time_zone)?

6
我想知道如何在Symfony/Doctrine中将MySQL时区设置为UTC (SET time_zone = 'UTC'),这样当我在查询中调用DATETIME字段上的UNIX_TIMESTAMP()函数时,它返回UTC Unix时间而不是服务器时区的Unix时间。我该怎么做呢?无论是在每次连接时自动执行还是在需要时手动执行?
顺便说一下,我需要在MySQL查询中进行此转换,而不是在应用程序中,以便我可以按照需要使用epoch时间进行GROUP BY操作。
5个回答

5
您可以通过在ProjectConfiguration中调用的configureDoctrineConnection回调函数来实现此操作:
public function configureDoctrineConnection(Doctrine_Connection $connection)
{
  $connection->exec('SET time_zone = "UTC"');
}

如果您正在使用多个连接,可能会出现问题。
(答案已编辑以删除有缺陷的其他方法。)

第一个出错了,错误信息是“没有打开的连接在...”,但第二个运行得很好,谢谢。注意:我猜在我的机器上"UTC"不是一个有效的时区,所以我把它改成了"+0:00"。 - scotts

1
我会尝试编辑projectConfiguration,并添加类似以下内容(未经测试和验证):
    $databaseManager = new sfDatabaseManager($this->configuration);
    $connection = $databaseManager->getDatabase($options['connection'])->getConnection();
    $diff = $connection->execute("SET time_zone = 'UTC'");

请注意,$options$this->configuration仅在任务中可用,因此可能应该硬编码(我相信默认值为'doctrine')。

无法直接使用,而且我对Symfony的了解不够,很难进行故障排除(在这种情况下,$this->configuration为空)。 - scotts
这里提供的解决方案不一定能够直接使用;我只是指出了寻找答案的正确方向(在此情况下是Jeremy的方向)。 - Bouke
我并不是想暗示他们这样做了,只是因为有另一个立即有效的答案,所以我没有花太多时间来解决它。谢谢。 - scotts

0

对于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 }

0
如果您想在Symfony应用程序级别上执行此操作,方法是将其添加到config/settings.yml中。
all:
  .settings:
    default_culture: en_US
    default_timezone: Asia/Kolkata

请问您能同时添加文档链接吗? - Musa Haidari

0

抱歉,答案是关于 Oracle DB 而不是 MySQL。我搜索了很长时间的 Oracle DB 数据,但是没有找到任何内容。 这是唯一一个讨论该问题的主题,但只涉及 MySQL。

也许有人可以帮忙解决 Oracle DB 问题:

对于 Symfony 4,在文件 config/services.yaml 中:

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 }

或者,您可以将参数对象写入yaml格式:

arguments: { TIME_ZONE: 'UTC' }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接