Laravel introduces the existsOr method, providing an elegant solution for executing code when model queries return no results. This addition streamlines error handling and alternative logic for non-existent models.
The existsOr method allows developers to define fallback behavior directly within the query chain:
Model::where(...) ->existsOr(function () { // Execute logic when model doesn't exist });
This approach proves particularly valuable in inventory management systems:
class InventoryController extends Controller{ public function verifyStock($itemCode) { return Item::where('code', $itemCode) ->where('quantity', '>', 0) ->existsOr(function () use ($itemCode) { Log::warning("Stock check attempted for unavailable item: {$itemCode}"); return response()->json([ 'in_stock' => false, 'message' => 'Item unavailable or out of stock' ], 404); }); } public function reserveItem($itemId, $quantity) { return Item::where('id', $itemId) ->where('available_quantity', '>=', $quantity) ->existsOr(function () use ($itemId, $quantity) { throw new InsufficientStockException( "Cannot reserve {$quantity} units of item {$itemId}" ); }); } public function updatePricing($itemId, $newPrice) { return Item::where('id', $itemId) ->where('status', 'active') ->existsOr(function () use ($itemId) { event(new PricingUpdateFailed($itemId)); return redirect() ->route('inventory.index') ->with('error', 'Item not found or inactive'); }); }}
The existsOr method also works effectively for subscription and access control scenarios:
class SubscriptionController extends Controller{ public function accessFeature($userId, $featureId) { return Subscription::where('user_id', $userId) ->where('status', 'active') ->where('expires_at', '>', now()) ->existsOr(function () use ($userId, $featureId) { // Log unauthorized access attempt Log::notice("Access denied for user {$userId} to feature {$featureId}"); // Redirect to upgrade page return redirect() ->route('subscriptions.upgrade') ->with('message', 'This feature requires an active subscription'); }); } public function validateAccess($organizationId, $userId) { return OrganizationMember::where('organization_id', $organizationId) ->where('user_id', $userId) ->where('status', 'approved') ->existsOr(function () { abort(403, 'Access denied to this organization'); }); }}
The existsOr method creates cleaner code by eliminating the need for separate existence checks followed by conditional logic. Instead of writing:
$exists = Model::where(...)->exists();if (!$exists) { // Handle non-existence}
You can now write:
Model::where(...) ->existsOr(function () { // Handle non-existence });
This approach maintains query chain flow while providing clear handling for missing model scenarios.