How to remove duplicates in collection?

You can unique the data set from the SQL level with groupBy + Max Try below

YourModelName::select(DB::raw('max(`town_short_name`) as town' 'town_long_name'))
        ->groupBy(['town_short_name'])
        ->without('postalCode','country','countryState')
        ->where('town_short_name','like','%'.$townName.'%')
        ->limit(100)
        ->orderBy('town_short_name');

$unique = $collection->unique();

$collection = collect([
    ['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
    ['name' => 'iPhone 5', 'brand' => 'Apple', 'type' => 'phone'],
    ['name' => 'Apple Watch', 'brand' => 'Apple', 'type' => 'watch'],
    ['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
    ['name' => 'Galaxy Gear', 'brand' => 'Samsung', 'type' => 'watch'],
]);

Then let's say you want the brand to be unique, in this case you should only get two brands 'Apple', and 'Samsung'

$unique = $collection->unique('brand');

$unique->values()->all();
/*
    [
        ['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
        ['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
    ]
*/

This is taken from https://laravel.com/docs/master/collections#method-unique