2014-12-10 4 views
11

Ho letto Code Bright di Dayle Rees per ulteriori informazioni su Eloquent Collection s utilizzato in Laravel. Ha fatto qualche altra ricerca, ma non ho trovato la risposta che stavo cercando.Come inserire un oggetto (tipo di oggetto Modello) in oggetto di raccolta in Laravel con un numero di indice specifico?

Desidero inserire un oggetto (Model tipo oggetto) in un oggetto Collection in una posizione specifica.

Ad esempio:

Questa è la collezione restituita

Illuminate\Database\Eloquent\Collection Object 
(
    [0] => Attendance Object 
     ([present_day] => 1) 

    [1] => Attendance Object 
     ([present_day] => 2) 

    [2] => Attendance Object 
     ([present_day] => 4) 

    [3] => Attendance Object 
     ([present_day] => 5) 

) 

Come potete vedere sopra [present_day] hanno un valori che vanno da 1 to 5, ma il valore, 3 manca nella sequenza. Ora, quello che voglio veramente fare è che voglio inserire esplicitamente un nuovo Attendance Object nella posizione dell'oggetto di raccolta di [2] numero di indice/posizione, quindi spingendo il resto dell'oggetto di partecipazione. Sto davvero lottando per farlo bene. Come posso fare questo per fare in precedenza oggetto di raccolta per assomigliare a qualcosa come di seguito:

Illuminate\Database\Eloquent\Collection Object 
(
    [0] => Attendance Object 
     ([present_day] => 1) 

    [1] => Attendance Object 
     ([present_day] => 2) 

    [2] => Attendance Object // This is where new object was added. 
     ([present_day] => 3) 

    [4] => Attendance Object 
     ([present_day] => 4) 

    [5] => Attendance Object 
     ([present_day] => 5) 

) 

io ci credo sia alcuni metodi che vi permettono di fare esattamente come questo se fosse array. Poiché si tratta di un Collection, non sono sicuro di come farlo.

Nota: Non voglio convertirlo in array e fare l'inserimento all'interno dell'array. Per qualche ragione, voglio avere questa uscita rigorosamente nell'oggetto Collection.

+1

L'oggetto di raccolta ha un metodo add, lo utilizza e quindi riordina la raccolta in questo modo; '$ collection-> sortBy (function ($ model) {return $ model-> present_day;});' Questo quindi riordina la collezione in base a ciò che si desidera. –

+0

Non ho ancora provato la soluzione. Solo leggendo il tuo commento, sono sicuro che dovrebbe funzionare. In realtà, un bel modo per aggirare il mio problema. –

+0

@MattBurrow L'ho fatto. Ha funzionato perfettamente !! –

risposta

11

Per inserire un articolo in una raccolta, fare riferimento a questa risposta; Answer

Fondamentalmente, divide la raccolta, aggiunge la voce all'indice pertinente.


Puoi aggiungere l'articolo alla oggetto Eloquent\Collection con il metodo add;

$collection->add($item); // Laravel 4 

o

$collection->push($item); // Laravel 5 

Quindi è possibile riordinare la collezione utilizzando il metodo sortBy;

$collection = $collection->sortBy(function($model){ return $model->present_day; }); 

Questo sarà riordinare la collezione di tua attributi present_day.


Si noti che il codice sopra funzionerà solo se si utilizza Illuminate\Database\Eloquent\Collection. Se si utilizza un normale Eloquent\Support\Collection, non esiste un metodo add.

Invece, è possibile utilizzare un offset array vuoto, lo stesso come l'inserimento di un nuovo elemento in una matrice normale:

$collection[] = $item; 

Questo modulo funziona anche sulla versione eloquenti Collection.

+1

Per tutti coloro che vengono qui e si chiede che questo non funzioni più [L5 e versioni successive], prova '$ collection-> push ($ item);'. Aggiunge un elemento alle collezioni fine – manniL

+1

Non sono sicuro del motivo per cui questa è la risposta accettata quando non si fa menzione dell '"indice" – Andrew

+0

Importante ricordare che abbiamo anche '$ collection-> prepend()' e '$ collection-> merge() ', a volte sono anche utili, dato che è semplicemente' collect() 'per creare una nuova' Collection'. – giovannipds