为了账号安全,请及时绑定邮箱和手机立即绑定

如何在全局范围内将所有 Eloquent 时间戳视为包括时区

如何在全局范围内将所有 Eloquent 时间戳视为包括时区

PHP
隔江千里 2022-07-22 19:15:56
我有一个 Laravel 应用程序,我只是在每次迁移中都切换timestampTz到了。由于更改导致的日期格式不匹配timestampsTz,我一跑就php artisan migrate立即遇到了 Carbon 的“尾随数据”问题。$dateFormat当我无意使用无时区时间戳列时,我不想将该属性添加到我创建的每个模型中。我也不想引入一个特征或创建一个扩展 Eloquent 模型的新超类,然后我需要将其添加到我已经拥有的每个模型(以及我将来生成的模型)中。有什么办法可以避免这一切,只是让每个时间戳字段都被视为都有时区?
查看完整描述

1 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

这在 Laravel 6 中很容易通过创建一个新的 Illuminate Grammar 类并覆盖该getDateFormat方法来完成,如果模型上缺少该属性,该方法将用作后备。dateFormat


看看里面vendor/laravel/framework/src/Illuminate/Database/Query/Grammars。您的课程将需要根据您连接的数据库扩展此处找到的特定于供应商的语法课程之一。对于这个例子,我将扩展PostgresGrammar. app/Providers/AppServiceProvider.php像这样调整:


use Illuminate\Support\Facades\DB;


class AppServiceProvider extends ServiceProvider

{

    /**

     * Register any application services.

     *

     * @return void

     * @throws \Doctrine\DBAL\DBALException

     */

    public function register()

    {

        // ...


        $conn = DB::connection(DB::getDefaultConnection());

        $platform = $conn->getDoctrineConnection()->getDatabasePlatform();

        $conn->setQueryGrammar(new class($platform->getDateTimeTzFormatString()) extends PostgresGrammar {

            protected $date_format;


            public function __construct(string $date_format)

            {

                $this->date_format = $date_format;

            }


            public function getDateFormat()

            {

                return $this->date_format;

            }

        });

    }

}

这将用另一个让我们接管日期格式字符串的查询语法替换原始查询语法。匿名类用于避免为这一小部分功能创建单独的文件,但您可以选择将其移至其自己的文件以提高可读性。匿名类的值$platform->getDateTimeTzFormatString()作为构造函数的唯一参数传递,然后存储以供getDateFormat方法使用。


在此更改之后,任何尾随数据错误都应该永远消失。只需确保在以后的每次迁移中都使用timestampTz和timestampsTz。第三方库通常允许您发布与其捆绑的任何迁移,允许您根据需要进行调整。


查看完整回答
反对 回复 2022-07-22
  • 1 回答
  • 0 关注
  • 93 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信