情況屬性:我有一個模型(我們稱之爲Pivot
)誰聲明如下:自定義created_at在樞軸模式
class Pivot extends Model
{
public $timestamps = false;
.....
}
它有5個領域:id
,notification_id
,device_id
,created_at
, read_at
。
這種模式被用作數據透視表Notification
和Device
之間:
// 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',
],
如何在當前的laravel項目中更改時區?在'config/database.php'''mysql'=>'driver'=>'mysql',....,'timezone'=>'+00:00']'! – Maraboc
我會試試看! – gbalduzzi
它工作嗎? – Maraboc