2017-07-28 45 views
1

情況屬性:我有一個模型(我們稱之爲Pivot)誰聲明如下:自定義created_at在樞軸模式

class Pivot extends Model 
{ 
    public $timestamps = false; 
    ..... 
} 

它有5個領域:idnotification_iddevice_idcreated_atread_at

這種模式被用作數據透視表NotificationDevice之間:

// Notification.php 
public function devices() 
{ 
    return $this->belongsToMany(Device::class) 
     ->withPivot(['id','created_at','notification_id','device_id', 'read_at']); 
} 

public function pivots() { 
    return $this->hasMany(Pivot::class); 
} 

,我做的設備類中的一樣。

我的MySQL有一個不同於UTC的時區(Europe\Rome),我無法更改它,因爲它已被不同的項目使用。

問題:如何設置created_at字段正常工作?

我試圖使用默認時間戳,它的工作原理但它也將添加updated_at列,我不能擁有它(它會增加太多的冗餘)。

所以我設置public $timestamps = false;和我的數據庫一樣,創建領域:

$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); 

這一個問題是,正如前面所說的,MySQL有一個錯誤的時區(Europe\Rome),所以當我從此表中讀取數據的created_at值將從原始值偏移2小時。當我還設置read_at屬性時,這是一個問題,因爲它會創建在創建之前讀取通知的情況。

我最後的想法是在創建事件中設置created_at。我遵循this laracast guide,但顯然,如果數據是從sync方法作爲數據透視表插入的,則不會調用事件(它們不適用於我)。

您有其他想法嗎?當然有一些醜陋的黑客可以工作(例如在創建的Pivot上迭代並手動設置它們),但我想使用更好的解決方案。

編輯:@Maraboc提出的解決方案工作完美。我設置的MySQL配置陣列的時區財產config/database.php

'mysql' => [ 
     'driver' => 'mysql', 
     'host' => env('DB_HOST', '127.0.0.1'), 
     'port' => env('DB_PORT', '3306'), 
     'database' => env('DB_DATABASE', 'forge'), 
     'username' => env('DB_USERNAME', 'forge'), 
     'password' => env('DB_PASSWORD', ''), 
     'unix_socket' => env('DB_SOCKET', ''), 
     'charset' => 'utf8mb4', 
     'collation' => 'utf8mb4_unicode_ci', 
     'prefix' => '', 
     'strict' => true, 
     'engine' => null, 
     'timezone' => '+00:00', 
    ], 
+1

如何在當前的laravel項目中更改時區?在'config/database.php'''mysql'=>'driver'=>'mysql',....,'timezone'=>'+00:00']'! – Maraboc

+0

我會試試看! – gbalduzzi

+1

它工作嗎? – Maraboc

回答

0

使用model events設置時間戳當你創建模型。您可以一起設置字段和時區。

class Pivot extends Model 
{ 
    public $timestamps = false; 

    protected static function boot() 
    { 
     static::creating(function($model) { 
      $model->create_at = Carbon::now('Europe\Rome'); 
     }); 

     parent::boot(); 
    } 
} 

不要忘記parent::boot()否則不會在模型上引導任何特徵。