Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[11.x] Add find sole query builder method #54667

Merged

Conversation

zepfietje
Copy link
Contributor

@zepfietje zepfietje commented Feb 18, 2025

I find myself writing Model::whereKey($id)->sole(); a lot in my applications to retrieve a model that I know should exist. The findOrFail() method provides similar functionality, but there's no guarantee that only a single record exists in the database since it calls first() internally.

This pull request introduces a new findSole() method to retrieve a single model by its key, or throw an exception when no or multiple models match the query. Alternatively, findOrFail() could be updated to behave like this but that would be a breaking change. Personally, I also think findSole() reads nicer when what I want to do is "find a sole model which I know the key of".

If you want me to make any changes, clarify anything, or add specific tests, please let me know. 😊

@zepfietje zepfietje changed the title Add find sole query builder method [11.x] Add find sole query builder method Feb 18, 2025
@simonhamp
Copy link
Contributor

sole() already throws an exception if there's more than one result.

@zepfietje
Copy link
Contributor Author

sole() already throws an exception if there's more than one result.

Yeah I know, that's why findSole() uses that under the hood.
Or am I missing something? 🙂

@simonhamp
Copy link
Contributor

simonhamp commented Feb 18, 2025

Sorry, I interpreted your description as suggesting that sole doesn't throw an exception.

If you're getting a row by its ID, then by definition, there is already only one... So it's hard to see why findOrFail is insufficient?

I think you may need to provide a clearer example of your specific use-case.

@zepfietje
Copy link
Contributor Author

I'm aware that technically this shouldn't make a difference when your primary key column is unique on database level (as it should be).

However, I do like the explicit assertion that only a single record is returned instead of silently discarding any potential other records (though theoretically not needed when the primary key is unique).

I always use sole() instead of firstOrFail() for queries where I know there should only be a single record returned. In line with that, whereKey()->sole() and thus findSole() feel natural to me.

@taylorotwell taylorotwell merged commit ee0f81f into laravel:11.x Feb 18, 2025
46 checks passed
@zepfietje zepfietje deleted the add-find-sole-query-builder-method branch February 18, 2025 15:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants