Differentiate explicit null from default using __UNSET__
in whenLoaded method
#55381
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.
Fixes #55374.
Description
Due to the PHP 8 named arguments feature, we encountered an ambiguity issue. Previously, when calling methods like
whenLoaded
, explicitly passing anull
argument was indistinguishable from omitting the argument completely. This ambiguity could cause unexpected results, like unintentionally returning the entire related entity instead of the intendednull
value.For example, before this fix, the following call:
would incorrectly return the whole
'entity'
object ifcomment
wasnull
in the database (and that's because of the changes intriduced in #51342 because of null verification)To resolve this ambiguity clearly and effectively, we've introduced a sentinel default value (
'__UNSET__'
) to reliably identify if an argument was explicitly provided asnull
or simply omitted.Changes
Before:
(Cannot distinguish an explicitly provided null from omitted parameter)
After:
(Clearly distinguish an explicitly provided null from omitted parameter)
Impact of this Change
With this fix, explicitly passing
null
will behave correctly and predictably:whenLoaded('relation', null)
explicitly returnsnull
as intended.null
.Now, the example above returns the correct result: