Repository interfaces belong to the domain, not the ORM

A repository interface that returns Eloquent models and accepts query builders has not abstracted anything — it has renamed the ORM.

// in the domain, knowing nothing about storage
interface Orders
{
    public function ofCustomer(CustomerId $id): OrderCollection;
    public function save(Order $order): void;
}

// in infrastructure, knowing everything about it
final class EloquentOrders implements Orders
{
    public function ofCustomer(CustomerId $id): OrderCollection
    {
        $rows = OrderRow::where('customer_id', $id->value())->get();

        return OrderCollection::fromRows($rows);
    }
}

The named method rather than a generic findBy is what carries the meaning, and it also means the query is written once instead of assembled at each call site. The honest cost is a mapping layer between rows and domain objects, which is real work and is the reason most projects do not do this. It pays where the domain logic is complicated enough to be worth testing without a database, and does not where the application is mostly forms over tables.