Laravel时区设置

xiaohai 2018-08-31 09:58:47 6170人围观 标签: Laravel  php 
简介在做博客的过程中,发现updated_at为什么时间会少8个小时,原来这跟Laravel的时区有关。那么我们如何理解Laravel的created_at或updated_at两个字段是如何控制的呢?还有就是如果我们不想使用该功能又如何屏蔽呢?后面我们还将探究下Laravel相关源码。

  在设计数据表的时候,已经通过Navicat工具创建了两个字段,created_at和updated_at。created_at字段默认为CURRENT_TIMESTAMP,updated_at字段默认为ON UPDATE CURRENT_TIMESTAMP;其实Mysql是可以控制created_at字段在创建时的时间作为值,而updated_at字段会根据更新时的时间随之变动。

  但是当我们使用Laravel框架来操作数据表的时候,时间却不是依据Mysql的自有功能来设置的,而被Laravel框架给改变了,并且还少了8小时。如果要解决这个,就需要去设置Laravel框架的时区,在配置文件config/app.php中修改:

'timezone' => 'UTC',

只要将上面的UTC改为UTC或Asia/Shanghai

'timezone'='UTC', 设置 'timezone'='Asia/Shanghai'

那么从Laravel框架里的源码得知,Laravel确实是通过PHP代码来更新updated_at,

# vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasTimestamps.php protected function updateTimestamps() { $time = $this->freshTimestamp(); if (! is_null(static::UPDATED_AT) && ! $this->isDirty(static::UPDATED_AT)) { $this->setUpdatedAt($time); } if (! $this->exists && ! is_null(static::CREATED_AT) && ! $this->isDirty(static::CREATED_AT)) { $this->setCreatedAt($time); } }

从以上代码我们就可以得知,只要数据不存在就会设置created_at字段的值,存在与不存在都会去设置updated_at字段。所以将我们数据表设置的自有的机制给覆盖了。如果大家不想使用该功能,可以在模型中去掉Laravel自带的这种功能。只需要在每个模型文件中加上public $timestamps = false;如下:

<?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model { /** * 该模型是否被自动维护时间戳 * * @var bool */ public $timestamps = false; } #以上代码来源于Laravel文档,https://laravel-china.org/docs/laravel/5.6/eloquent/1403