with() eager loads now; load() does it afterwards

Both solve the same N+1 problem and they apply at different moments, which decides whether the collection you already have can be fixed or has to be re-fetched.

// at query time: two queries total
$orders = Order::with('customer')->get();

// after the fact: one extra query for the whole collection
$orders = Order::all();
$orders->load('customer');

// only if it has not been loaded already
$orders->loadMissing('customer');

load() is what you need when the collection arrives from somewhere you do not control — a repository, a cache, a paginator — and it is still one query rather than one per row. Both accept nested and constrained relations: with(['customer.address']) and with(['items' => function ($q) { $q->where('active', 1); }]), the latter being the one people write as a filter on the parent by mistake.