Allow find() to accept more complex where clauses #4110
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description
I've introduced a new class called
WhereFactory
whose implementation is identical to that of the existingBrackets
, it only varies in semantics i.e.QueryBuilder
won't insert brackets around aWHERE
clause generated by aWhereFactory
.Brackets
now inherits fromWhereFactory
and defines no additional functionality of its own, it's purely semantic i.e.QueryBuilder
will put brackets around aWHERE
clause generated byBrackets
.Any APIs that took
Brackets
now takeWhereFactory
, meaning they'll continue to acceptBrackets
in addition toWhereFactory
, so the API changes are non-breaking / backward compatible.Motivation
Simply put, more elaborate
WHERE
clauses returning entities - not just for type safety, but also to leverage functionality like eager loading.With this PR we now support (to my knowledge) all possible
WHERE
conditions when usingfind
; including brackets, sub-queries, combinations of string and object literal (property) conditions etc.e.g. Here we load user entities, eager load in their posts, but restrict to:
which would spit out something like the following:
WHERE "user"."id" = post.user_id AND (post.public = true OR "user"."id" IN (?, ?, ?))