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',
],
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
Ich werde es versuchen! – gbalduzzi
Funktioniert es? – Maraboc