zssarkany/laravel-database-sticky-timezone

服务,用于保持数据库连接时区与PHP默认时区同步

v1.0.4 2022-01-14 13:50 UTC

This package is auto-updated.

Last update: 2024-09-14 20:40:49 UTC


README

Latest Version on Packagist Software License Build Status StyleCI Scrutinizer Code Quality Code Coverage Open Issues Total Downloads

服务,用于保持数据库连接时区与PHP默认时区同步。

用途

在项目中处理timestamp类型的数据库字段至少有两种不同的方法

  • 使用预定义的时区偏移量获取数据,并使用JavaScript或PHP调整结果字符串表示值;
  • 通过设置数据库连接的时区偏移量来调整数据库连接,然后获取所需字符串表示的时间戳值。

显然,这两种方法都有优点和缺点,但如果需要支持LIKE匹配(例如:2019-06-% 或 %19-06%),则第一种方法似乎相当具有挑战性。

本包旨在实现第二种方法。

存储引擎将这些值存储为32位无符号整数,字符串表示(YYYY-MM-DD HH:MM:SS)取决于连接特定的时区偏移量。选择、更新、where表达式可能会在没有适当注意的情况下提供意外结果。

底层 Illuminate\Database\MySqlConnection 被扩展,getPdo()getReadPdo() 方法被更改检测器和执行器逻辑覆盖。当调用这些方法时,底层PDO对象将被检查以替换,并与之前设置的偏移值比较PHP默认时区偏移量(date('P'))。如果检测到更改,则在该特定PDO实例上执行'SET time_zone = "+hh:mm"',其中+hh:mm等于date('P')

这使得开发者能够简单地通过date_default_timezone_set(...)更新PHP默认时区,之后执行的数据库查询将受到影响的新偏移量。影响限于timestamp字段,datetime不受影响。

要求

  • PHP >= 7.1
  • Laravel >= 5.5

请参阅 PHP和Laravel单元和集成测试

安装

通过Composer

$ composer require zssarkany/laravel-database-sticky-timezone

不需要将服务提供者添加到config/app.php,但如果服务发现通过composer.json禁用,则需要将ZsSarkany\LaravelDatabaseStickyTimezone\DatabaseStickyTimezoneServiceProvider::class添加到providers数组中,否则连接解析器将在数据库连接解析后绑定。

使用

sticky_timezone => true追加到config/database.php中的mysql连接配置以启用自动时区调整。

示例

return [
    // ...
    'connections' => [
        // ...
        'mysql' => [
            // ...
            'sticky_timezone' => true,
        ],
        // ...
    ],
    // ...
];

在此连接上执行的SQL语句将考虑PHP默认时区的时间戳字段。

PHP和Laravel单元和集成测试

包在以下条件下进行了测试

支持的驱动程序

包目前仅支持MySQL驱动程序,但应该很容易实现对Laravel提供的其他驱动程序的兼容性。

欢迎贡献 :)

变更日志

请参阅 CHANGELOG 了解最近更改的详细信息。

测试

$ composer test

贡献

请参阅 CONTRIBUTINGCODE_OF_CONDUCT 了解详细信息。

安全

如果您发现任何与安全相关的问题,请通过zsolt.sarkany@gmail.com发送电子邮件,而不是使用问题跟踪器。

鸣谢

许可证

麻省理工学院许可证(MIT)。请参阅许可证文件以获取更多信息。