2017-07-28 4 views
1

Situation: Ich habe ein Modell haben (wir es Pivot nennen), der erklärt wird, wie folgt:Individuelle created_at auf einem Dreh Modell Attribut

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

Es verfügt über 5 Felder: id, notification_id, device_id, created_at, read_at.

// 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); 
} 

Und ich tat das gleiche in der Geräteklasse:

Dieses Modell ist als der Pivot-Tabelle zwischen Notification und Device verwendet.

Mein MySQL hat eine Zeitzone (Europe\Rome) anders als UTC und ich kann es nicht ändern, weil es bereits von verschiedenen Projekten verwendet wird.

PROBLEM: Wie zum Einrichten der created_at Feld ordnungsgemäß funktioniert?

Ich habe versucht, Standard-Zeitstempel zu verwenden, es funktioniert, aber es wird auch die updated_at Spalte hinzufügen und ich kann es nicht haben (es würde zu viele Redundanz hinzufügen).

Also habe ich public $timestamps = false; und i erstellt das Feld in der Datenbank wie folgt aus:

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

Das Problem dieses ist, dass, wie bereits gesagt, MySQL eine falsche Zeitzone (Europe\Rome) hat, so dass, wenn ich Lesen Sie Daten aus dieser Tabelle der created_at Wert ist um 2 Stunden vom Original verschoben. Dies ist ein Problem, wenn ich auch die read_at-Eigenschaft festlegen, da es Situationen erstellt, in denen die Benachrichtigung vor der Erstellung gelesen wird.

Die letzte Idee, die ich hatte, war die created_at in einem schaffenden Ereignis zu setzen. Ich folgte this laracast guide, aber anscheinend, wenn die Daten als eine Pivot-Tabelle von einer sync Methode eingefügt werden, werden Ereignisse nicht aufgerufen (sie funktionierten nicht für mich).

Haben Sie andere Ideen? natürlich gibt es ein paar hässliche Hacks, die funktionieren könnten (wie Iterieren auf dem erstellten Pivot und manuell einstellen), aber ich würde gerne eine bessere Lösung verwenden.

BEARBEITEN: die von @Maraboc vorgeschlagene Lösung funktionierte perfekt. Ich habe die Zeitzone-Eigenschaft von MySQL Config Array in 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

Wie sieht es mit der Änderung der Zeitzone gerade im aktuellen Laravel-Projekt aus? in der 'config/database.php'' 'mysql' => [ 'Treiber' => 'mysql', ...., 'Zeitzone' => '+00: 00'] '! – Maraboc

+0

Ich werde es versuchen! – gbalduzzi

+1

Funktioniert es? – Maraboc

Antwort

0

Verwenden model events den Zeitstempel zu setzen, wenn Sie das Modell erstellen. Sie können das Feld und die Zeitzone zusammen festlegen.

class Pivot extends Model 
{ 
    public $timestamps = false; 

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

     parent::boot(); 
    } 
} 

Sie auf dem Modell der parent::boot() oder sonst bekommen keine Züge gebootet nicht vergessen.

Verwandte Themen