zssarkany / laravel-database-sticky-timezone
服务,用于保持数据库连接时区与PHP默认时区同步
Requires
- php: >=7.1
Requires (Dev)
- mockery/mockery: ^1.0
- orchestra/testbench: ^3.7
- phpunit/phpunit: >=7.0
- squizlabs/php_codesniffer: ^3.0
This package is auto-updated.
Last update: 2024-09-14 20:40:49 UTC
README
服务,用于保持数据库连接时区与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
安装
通过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
贡献
请参阅 CONTRIBUTING 和 CODE_OF_CONDUCT 了解详细信息。
安全
如果您发现任何与安全相关的问题,请通过zsolt.sarkany@gmail.com发送电子邮件,而不是使用问题跟踪器。
鸣谢
许可证
麻省理工学院许可证(MIT)。请参阅许可证文件以获取更多信息。