Q:

Eliminar elementos repetidos de una coleccion de objetos

obtuve esta colección de ventas por productos:
$ventas = VentasProductos::withCount('producto')
                        ->orderBy('producto_count', 'desc')
                        ->take(5)
                        ->get();

pero en la vista me muestra los elementos repetidos, me cree esta linea de código pero no me elimina uno de los elementos repetidos:
if($ventas){
        foreach($ventas as $key=>$venta){
           if(array_key_exists($venta->id, $ventas)){
                unset($ventas[$key]);
          }
        }
    }

Pero al parecer estoy aplicando mal el array_key_exists y no se me elimina el elemento repetido.
#items: array:4 [▼
    0 => VentasProductos {#1791 ▼
      +table: "ventas_productos"
      +fillable: array:6 [▶]
      #casts: array:7 [▶]
      #connection: "mysql"
      #primaryKey: "id"
      #keyType: "int"
      +incrementing: true
      #with: []
      #withCount: []
      #perPage: 15
      +exists: true
      +wasRecentlyCreated: false
      #attributes: array:10 [▶]
      #original: array:10 [▼
        "id" => 8
        "cantidad" => 1
        "importe" => 6.0
        "importe_pagado" => 0.0
        "deuda" => 1
        "created_at" => null
        "updated_at" => null
        "producto_id" => 9
        "factura_id" => 11
        "producto_count" => 1
      ]
      #changes: []
      #dates: []
      #dateFormat: null
      #appends: []
      #dispatchesEvents: []
      #observables: []
      #relations: []
      #touches: []
      +timestamps: true
      #hidden: []
      #visible: []
      #guarded: array:1 [▶]
    }
    1 => VentasProductos {#1792 ▼
      +table: "ventas_productos"
      +fillable: array:6 [▶]
      #casts: array:7 [▶]
      #connection: "mysql"
      #primaryKey: "id"
      #keyType: "int"
      +incrementing: true
      #with: []
      #withCount: []
      #perPage: 15
      +exists: true
      +wasRecentlyCreated: false
      #attributes: array:10 [▼
        "id" => 10
        "cantidad" => 1
        "importe" => 6.0
        "importe_pagado" => 2.0
        "deuda" => 1
        "created_at" => "2018-03-26"
        "updated_at" => "2018-03-27"
        "producto_id" => 9
        "factura_id" => 17
        "producto_count" => 1
      ]
      #original: array:10 [▼
        "id" => 10
        "cantidad" => 1
        "importe" => 6.0
        "importe_pagado" => 2.0
        "deuda" => 1
        "created_at" => "2018-03-26"
        "updated_at" => "2018-03-27"
        "producto_id" => 9
        "factura_id" => 17
        "producto_count" => 1
      ]
      #changes: []
      #dates: []
      #dateFormat: null
      #appends: []
      #dispatchesEvents: []
      #observables: []
      #relations: []
      #touches: []
      +timestamps: true
      #hidden: []
      #visible: []
      #guarded: array:1 [▶]
    }
    2 => VentasProductos {#1793 ▶}
    3 => VentasProductos {#1794 ▶}
  ]
}

Y deberia salir solamente uno

A:

Con la función withCount obtienes la cantidad de elementos resultado de la relación con otra tabla, sin tener que cargarlos. El problema es que cuando lo llamas desde la entidad que tiene la relación de muchos a uno, se pueden repetir elementos y principalmente la nueva propiedad *_count que te agregará a los resultados siempre será 1. por consiguiente te recomiendo que llames withCount desde la entidad que tiene la relación de 1 a muchos, logrando obtener elementos no repetidos y la cantidad real de las relaciones con la otra entidad.
$prod = Productos::withCount('ventas_productos')
                  ->orderBy('ventas_productos_count', 'desc')
                  ->take(5)
                  ->get();

