Need Exactly One Item? Use sole() on Laravel Collections
Laravel Collections provide a powerful method called:
sole()
The sole() method returns an item from the collection only when exactly one element matches.
Using a Callback
You may pass a callback to sole(). It will return the item only if the callback matches exactly one element.
collect([10, 20, 30, 40])->sole(function (int $value) {
return $value === 20;
});
Result:
20
Using Key / Value Pairs
You may also provide a key and value pair.
Suppose you have a collection of coupons:
$coupons = collect([
['code' => 'SAVE10', 'discount' => 10],
['code' => 'SAVE20', 'discount' => 20],
]);
Retrieve a coupon by its code:
$coupons->sole('code', 'SAVE20');
Result:
[
'code' => 'SAVE20',
'discount' => 20,
]
This is useful when you know there should be exactly one matching item.
Real Project Example
Suppose a user should have only one default address:
$defaultAddress = $user->addresses
->sole('is_default', true);
Result:
[
'city' => 'Ahmedabad',
'is_default' => true,
]
This guarantees that only one address is marked as default.
Why Use sole()?
sole() helps you:
- Retrieve exactly one matching item
- Express business rules clearly
- Avoid silently returning the first result
- Detect unexpected collection states