2013-09-05 42 views
9

Non sono sicuro se è possibile, ma sto cercando di eseguire array_unique su una raccolta di elementi che ho, per rimuovere i duplicati. Anche se non riesco a farlo funzionare.Array_unique su una collezione eloquente di laravel

mia logica di controllo:

// init models 
    $jobs = Job::search(); 
    $countries = $jobs->get()->map(function($job) { 

     return $job->country; 
    }); 
    $countries = array_unique($countries->toArray()); 

anche se questo diventa un "Array alla conversione stringa" errore

+1

I; m non sono sicuro del contenuto del db-table, ma non è più semplice ottenere il risultato desiderato da una query? - e, se desideri eseguire il debug delle tue righe di codice, prova a stampare alcuni dati tra le tue funzioni e verifica la correttezza dell'output. –

+1

Hai invece provato a usare '-> groupby ('country')' o '-> distinct() -> get (array ('country'))' nella tua query? – Jeemusu

risposta

1

È possibile avere valori univoci nei risultati del DB utilizzando distinct or group by nel gruppo selezionato uso. Ma, se si davvero bisogno di avere valori univoci su un array di oggetti è possibile effettuare le seguenti operazioni:

$uniques = array(); 
foreach ($countries as $c) { 
    $uniques[$c->code] = $c; // Get unique country by code. 
} 

dd($uniques); 
26

Si potrebbe provare il metodo unico della classe Collection:

$countries = $countries->unique(); 

La classe Collection ha diversi metodi meravigliosi. Si può leggere su questo nel Laravel API documentation.

Sono d'accordo che a volte è più efficiente "interrogare" su una raccolta esistente in memoria (invece di fare un'altra query sul database usando la classe Querybuilder), come ad esempio prima si vuole contare e poi filtrare. In .NET LINQ è possibile eseguire query quasi uguali su un oggetto IEnumerable (collezione in memoria) come su un database, cosa che mi piace davvero.

2

Ho avuto un problema simile e anche se il tempo è passato poiché potrebbe essere utile a qualcuno oggi.

Il problema era che quando ho chiamato il metodo unique per la raccolta di elementi non ha funzionato, questo è probabilmente il motivo per cui la prima risposta è stata accettata. Quindi, se si dispone di modelli e si desidera rimuovere i duplicati in base a un campo specifico è possibile passare il parametro al metodo unique, in questo caso sarebbe:

$countries->unique('code'); 

in questo modo avrete solo paesi con codici unici . Potresti notare che solo il primo valore rimane, quindi se sviluppi un'applicazione per il carrello e vuoi per qualche ragione unire i carrelli e vuoi solo avere articoli recenti puoi semplicemente capovolgere la raccolta e chiamare unique e invertire:

$countries->reverse()->unique('code')->reverse(); // it doesn't really make sense in this example though 

probabilmente non è l'opzione migliore ed è meglio fare il filtro sul lato del database ma è bello avere opzioni.

Problemi correlati