2016-07-27 9 views
2
aktualisieren

Ich schreibe eine Bereichsabfrage und ich bin in einem fetch_date übergeben, um Dinge aus der DB-Tabelle basierend auf dem created_at Zeitstempel zu ziehen.Laravel Datum ändern, wenn ich eine Variable

Ich versuche, alle Datensätze für einen Monat zu finden, aber die Variable $fetch_date sich dauernd ändert, wenn ich folgendes versuchen:

//$fetch_date is a carbon instance and is equal to the month the user selected 
    //ie: Carbon {#221 ▼ 
    // +"date": "2016-07-01 00:00:00.000000" 

    //Create the next_month 
    $next_month = $fetch_date->addMonth(); 
    //Format next_month as a string 
    $next_month = $next_month->format('Y-m-d'); 
    //Format fetch_date as a string 
    $fetch_date = $fetch_date->format('Y-m-d'); 

    dd($fetch_date); 
    //This now gives me 2016-08-01 - why? 

Warum funktioniert die fetch_date Änderung? Ich versuche im Wesentlichen, den $fetch_date als aktuellen Monat und den $next_month zu behalten, um einfach der Anfang des nächsten Monats zu sein.

Ich schätze, es gibt einen wirklich einfachen Grund, den ich nur übersehe.

+0

Ich denke, Sie fügen einen Monat der Variable fetch_date. Versuchen Sie es zu kopieren und fügen Sie dann den Monat hinzu. –

Antwort

1

helfen Da der Aufruf addMonth Methode Nebenwirkungen hat.

Wenn Sie bei Carbon aussehen source, werden Sie sehen, dass alle addMonth ist tut addMonths mit einem Wert von 1 Aufruf, die wiederum einfach DateTime::modify ruft. Es ist nicht explizit in der Dokumentation geschrieben, aber aus den Beispielen ist es ziemlich klar, daß der Aufruf der Methode des Zeitwerts gespeichert modifiziert:

Beispiel # 1 Datetime :: ändern() Beispiel

<?php 
$date = new DateTime('2006-12-12'); 
$date->modify('+1 day'); 
echo $date->format('Y-m-d'); 
?> 

Um dies zu vermeiden, behalten Sie eine Kopie der Zeit und ändern Sie das:

$also_fetch_date = clone $fetch_date; 
$next_month = $also_fetch_date->addMonth(); 
// ... 
+0

Interessant - und erklärt genau was war geht weiter. Danke für die gründliche Erklärung. Jetzt verstehe ich und Ihre Korrektur hat funktioniert, um das Problem zu lösen. – Hanny

+1

Uh, warum monate/clone objects hinzufügen, wenn du einfach php's strtotime benutzt hättest um den gewünschten Effekt zu erzielen. Auf der Hand könnte es auch in einer Zeile mit '-> copy' Methode in Carbon erfolgen. –

0

Scheint, dass Sie der fetch_date-Variable einen Monat hinzufügen.

Try this:

$next_month = Carbon::createFromFormat('Y-m-d', $fetch_date->format('Y-m-d')); 
$next_month->addMonth(); 

dd($next_month->format('Y-m-d')); 

Werfen Sie einen Blick auf die Dokumentation von Kohlenstoff: http://carbon.nesbot.com/docs/ Vielleicht Sie

+0

Ok, das habe ich versucht. Aus irgendwelchen * verrückten Gründen, selbst nachdem du es auf das geändert hast, was du hier getan hast - $ fetch_date wird immer noch geändert. Ich frage mich, ob vielleicht mein Browser nicht etwas seltsames zwischenspeichert - weil ich keine Ahnung habe, wie es möglich ist ... – Hanny

+0

Versuchen Sie die neue Lösung, um ein neues Kohlenstoffobjekt mit dem Namen next_month zu erstellen –