2016-01-31 12 views
6

Sto collegando una raccolta Laravel ordinata per created_at per creare una sequenza temporale. La data di inizio per ogni articolo è created_at e la data di fine è created_at del seguente elemento. Se è l'ultimo elemento, l'evento dura solo per un set di 30 giorni.Riferimento articolo successivo in una raccolta Laravel

mio codice attuale è questo:

@foreach ($statushistory->where('itemid', $timelineitemid) as $hist) 
    [ '{{$hist->newstatus}}', new Date({{$hist->created_at->format('Y')}}, {{$hist->created_at->format('n')-1}}, {{$hist->created_at->format('j')}}), new Date({{$hist->created_at->format('Y')}}, {{$hist->created_at->format('n')-1}}, {{$hist->created_at->format('j')}}) ], 
@endforeach 

Come si può vedere qui la data di fine è proprio la stessa della data di inizio, ma ho bisogno di essere alla data di inizio del successivo. Pensavo che ci sarebbe stato un aiutante come last() per le raccolte che potevo semplicemente chiamare next() o qualsiasi altra cosa. Poiché non c'è una chiave numerica, non posso semplicemente aggiungerne una e prenderla. L'articolo è ordinato per data, e l'unico campo di tipo ID è quello del database che è un ID casuale come 1434 o 1356.

Qualche idea su come ottenere la data di inizio dell'articolo successivo, e controllare se siamo a l'ultimo oggetto? Ho esaminato la funzione di PHP next ma non penso che faccia ciò di cui ho bisogno.

Molte grazie

risposta

2

La collezione sarà digitato da un indice di incremento così si dovrebbe essere in grado di fare ...

$collection = $statushistory->where('itemid', $timelineitemid); 

foreach ($collection->values() as $index=>$hist){ 
     //stuff here 
     $next =$collection->get(++$index) ; 
} 

sintassi Lama, ovviamente, un po 'diverso, ma si spera illustrare l'idea

+0

I migliori consigli. Ho aggiornato la mia risposta –

+0

Risposta corretta, con due piccole osservazioni. In primo luogo, penso che il metodo 'get' dopo il metodo' where' sia ridondante dato che I $ statushistory' è già una collezione (altrimenti non sarebbe possibile iterare su di esso come mostrato nella domanda). Dato che l'OP ha specificato che la raccolta è stata ordinata, potrebbe essere stata ordinata dopo essere stata recuperata dal database, quindi le chiavi dell'array potrebbero essere confuse, quindi il 'foreach' dovrebbe iterare' $ collection-> values ​​() 'per assicurarsi i valori di '$ index' sono in realtà sequenziali. – Bogdan

+0

@Bogdan Questi non sembrano funzionare. La variabile $ next è sempre nullo. Qualche idea...? – samiles

2

Devi prima ottenere Iterator:

$collection = $collection->getIterator(); 
$current = current($collection); 
$next = next($collection); 
Problemi correlati