PHP PHP Carbon - Datum korrekt verarbeiten?

Dsimon24

Lieutenant
Registriert
Aug. 2016
Beiträge
595
Hallo zusammen,

ich nutze Carbon und möchte damit in einer Schleife ein paar Datensätze erstellen
- leider erhalte ich aber als Ergebnis nicht das, was ich mir wünsche. Vielleicht hat
einer einen Tipp für mich, was ich hier falsch machen könnte?

Mein Code:
PHP:
$templates = Template::get();

$startDate = Carbon::parse('2022-06-12 12:30:00');

foreach ($templates as $tpl) {
    $init_date = $startDate; // Initialisierung
    $date = $init_date->addDays($tpl->day);
    Architecture::create([
        'date' => $date->toDateString(),
    ]);
}

In der Schleife befinden sich fünf Datensätze. Bei den ersten drei Datensätzen erhält
das Attribut $tpl->day den Wert 1 - bei den letzten zwei Datensätzen den Wert 2.

Mein Wunsch wäre, folgendes Ergebnis (in Klammern das, was ich erhalte):
Datensatz 1: 2022-06-13 (2022-06-13)
Datensatz 2: 2022-06-13 (2022-06-14)
Datensatz 3: 2022-06-13 (2022-06-15)
Datensatz 4: 2022-06-14 (2022-06-17)
Datensatz 5: 2022-06-14 (2022-06-19)

Was mache ich hier falsch?

VG.
 
Ich hab das der Einfachheit halber mal auf DateTime und ein simples Array umgeschrieben, damit funktionierts.
PHP:
$templates = [1, 1, 1, 2, 2];
$init_date = new DateTime('2022-06-12 12:30:00');

foreach ($templates as $tpl) {
    $date = $init_date->modify("+".$tpl." days");
    echo $date->format("d.m.Y H:i:s")."\r\n";
}
 
Aber auch in diesem Beispiel addiert der immer das Datum miteinander.
Wie setze ich denn bei jedem Schleifen-Durchlauf wieder auf das ur-
sprüngliche Datum zurück?
 
Gib doch einfach mal $startDate immer in der Schleife mit aus und schau, ob das nach wie vor den alten Wert hat. Für mich sieht es so aus, als wäre das nicht der Fall.

Sowas musst du machen:
$a = clone $b;

probier mal das:
Code:
$templates = [1, 1, 1, 2, 2];
$init_date = new DateTime('2022-06-12 12:30:00');

foreach ($templates as $tpl) {
    $date = clone $init_date;
    $date = $date->modify("+".$tpl." days");
    echo $date->format("d.m.Y H:i:s")."\r\n";
}
 
Das müsste funktionieren:
Code:
$templates = Template::get();

$startDate = CarbonImmutable:::parse('2022-06-12 12:30:00');

foreach ($templates as $tpl) {
    $date = $startDate->addDays($tpl->day);
    Architecture::create([
        'date' => $date->toDateString(),
    ]);
}

Am besten immer mit den Immutable Objects arbeiten, aus meiner Sicht ist das andere Verhalten extrem verwirrend (wobei wie immer gilt: If you know the rules, break them. Ich hätte nur Immutable zum Standard und Mutable als Option gemacht)
 
  • Gefällt mir
Reaktionen: abcddcba
Zurück
Oben