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?
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.
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.
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.