2016-01-27 5 views
3

Я пытаюсь создать массив дат погашения для системы бронирования в Laravel 4. В моей базе данных есть одна тестовая строка с начальным значением 2016-01-24 и end_date 2016-01- 29.Приращение дат с помощью Carbon

Это код, который тянет строку и перебирает даты с использованием углерода для увеличения на один день & добавить его в массив:

$reserved = Reservation::where('property_id', $property->id)->get(); 

$blackoutDays = []; 

foreach($reserved as $r) 
{ 
    $start = new \Carbon\Carbon($r->start_date); 
    $end = new \Carbon\Carbon($r->end_date); 
    $days = $start->diff($end)->days; 

    for($i = 0; $i <= $days; $i++) 
    { 
     $date = ''; 
     $date = $start->addDays($i); 

     $blackoutDays[] = $date->format('Y-m-j'); 
    } 
} 

То, что я пытаюсь получить в $ blackoutDays является:

[2016-01-24 »,« 2016-01-25 »,« 2016-01-26 »,« 2016-01-27 »,« 2016-01-28 »,« 2016- 01-29 "]

Но что я actua lly получает это:

[2016-01-24 "," 2016-01-25 "," 2016-01-27 "," 2016-01-30 "," 2016-02-3 " "," 2016-02-8 "]

Кто-нибудь знает, почему это происходит/как его исправить? Есть ли лучший способ сделать это?

ответ

8

Вы делаете приращение $i каждый пробег вашей петли. Таким образом, он добавляет 1 в первом прогоне, 2 дня во втором, 3 дня в третьем и так далее.

Таким образом, вы хотите заменить

$date = $start->addDays($i); 

с

$date = $start->addDays(1); 

Где вы, вероятно, упал в яму идея, что дни добавляются из объекта $start даты на каждом вызове, но это не так, поскольку этот объект не «Immutable».

+0

спасибо, работает отлично! Теперь я собираюсь спрятаться, пока не перестану чувствовать себя noob! –

1

Для получения более чистого результата, вы можете использовать метод addDay():

$date = $start->addDay(); 

Но на самом деле это точно так же. Исходный код для метода addDay():

/** 
* Add a day to the instance 
* 
* @param int $value 
* 
* @return static 
*/ 
public function addDay($value = 1) 
{ 
    return $this->addDays($value); 
}