whereDoesntHave('orders') ->where('updated_at', '<=', $cutoff) ->with('lines') ->chunkById(200, function ($carts) use (&$cartsAbandoned) { foreach ($carts as $cart) { if ($cart->lines->isEmpty()) { continue; } Event::dispatch(new CartAbandoned($cart)); $cartsAbandoned++; } }); Cart::query() ->whereHas('orders', fn ($query) => $query->whereNull('placed_at')) ->where('updated_at', '<=', $cutoff) ->with(['orders' => fn ($query) => $query->whereNull('placed_at')]) ->chunkById(200, function ($carts) use (&$checkoutsAbandoned) { foreach ($carts as $cart) { $order = $cart->orders->first(); if ($order === null) { continue; } Event::dispatch(new CheckoutAbandoned($cart, $order)); $checkoutsAbandoned++; } }); $this->components->info("Dispatched CartAbandoned for {$cartsAbandoned} cart(s), CheckoutAbandoned for {$checkoutsAbandoned} checkout(s)."); } }