Laravel-Zeitstempel, um Millisekunden anzuzeigen

8

Ich muss den update_at-Zeitstempel mit hoher Genauigkeit in einer Laravel-Anwendung speichern, und zwar im Format "m-d-Y H: i: s.u" (einschließlich milisseconds)

Laut Laravel-Dokumentation kann ich das Datumsformat anpassen, indem ich die $ dateFormat-Eigenschaft für eine Klasse festlege, aber ...

Das Hauptproblem ist, dass Laravels Schemaerstellung in der Datenbank eine Spalte vom Typ timestamp hinzufügt, wenn ich $ table- & gt; nullableTimestamps () verwende und gemäß der mysql-Dokumentation Spalten vom Typ TIMESTAMP zulassen die Präzision bis zu Sekunden.

Irgendwelche Ideen, wie ich das erreichen könnte?

    
raphadko 05.07.2015, 04:11
quelle

2 Antworten

7

Dies ist nicht möglich, da der PHP-PDO-Treiber in Zeitstempeln keine Sekundenbruchteile unterstützt. Eine Umgehung ist, den Timestamp stattdessen als String zu wählen, damit der PDO-Treiber seinen Timestamp nicht kennt, einfach indem man $query->selectRaw(DB::raw("CONCAT(my_date_column) as my_date_column")) tut. Dies bedeutet jedoch, dass Sie die Standardauswahl für alle Felder nicht verwenden können Schmerzen. Außerdem müssen Sie einige andere timestamp-bezogene Methoden im Modell überschreiben.

%Vor%

Schließlich in Ihrer Migration statt NullableTimestamps, außerhalb des Schemas Callback tun:

%Vor%

Beachten Sie, dass dieses Beispiel für 3 Dezimalstellen galt. Sie können jedoch bis zu 6 Dezimalstellen haben, indem Sie an zwei Stellen die 3 in eine 6 ändern, in der Alterstabelle und im Sprintf und auch den Multiplikator * 1000 auf 1000000 anpassen für 6.

Hoffentlich wird PHP-PDO eines Tages aktualisiert, um das zu beheben, aber es ist über 5 Jahre her, und nichts hat sich geändert, also habe ich keine Hoffnungen. Wenn Sie sich für die Details interessieren, lesen Sie diesen Fehlerbericht: Ссылка Ich habe diesen Link in dieser anderen Antwort gefunden, der Ihnen helfen könnte, das Problem besser zu verstehen: Ссылка

PHP zeigt in letzter Zeit wirklich sein Alter, und ich würde dieses Problem als einen meiner Gründe für einen Wechsel zu den moderneren Node.js betrachten.

    
malhal 10.08.2015 23:24
quelle
1

Gestützt auf malhals Antwort konnte ich einen Bruchteil der Zeitstempel lesen hier . Die Antwort hier für die Bequemlichkeit einfügen:

%Vor%

Hier ist eine Menge los, weil die Abfrage mit Gültigkeitsbereichen angewendet wird und am Ende eine Auswahl für die Spalte update_at hinzugefügt wird, die die zuvor geladene Spalte aktualisiere_at später überschreibt, während Laravel das Modell aus der Abfrage hydratisiert. Als hässlicher Hack hat es das erste Mal erstaunlich gut funktioniert.

Zeitstempel werden intern als Carbon in Laravel gespeichert:

%Vor%

Ausgabe:

%Vor%

Achten Sie auch darauf, eine Migration durchzuführen, um Ihre Spalten in fraktionale Zeitstempel zu konvertieren. Microsecond Precision erhöht die Größe von Zeitstempeln von 4 Bytes auf 7 Bytes, aber das ist 2017. Lassen Sie sich nicht ein oder zwei Bytes sparen, indem Sie die Millisekunden-Genauigkeit wählen, die Ihnen später ein Vermögen kostet, wenn Sie veraltete Cache-Einträge bereitstellen:

%Vor%

Leider habe ich keine Möglichkeit gefunden, das Migrationsschema timestamps() function zu ändern, um dies zu tun.

    
Zack Morris 15.04.2017 00:19
quelle

Tags und Links