-
Notifications
You must be signed in to change notification settings - Fork 11k
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] Fix incorrect bindings in DB::update when using a collection as a value #53254
Conversation
…s a value fixes #53226 Signed-off-by: Mior Muhammad Zaki <crynobone@gmail.com>
@@ -3848,7 +3848,11 @@ public function update(array $values) | |||
|
|||
$values = collect($values)->map(function ($value) { | |||
if (! $value instanceof Builder) { | |||
return ['value' => $value, 'bindings' => $value]; | |||
return ['value' => $value, 'bindings' => match (true) { | |||
$value instanceof Collection => $value->toArray(), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why not use $value->all()
and skip the implicit array_map
call inside to Collection@toArray()
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, I'd change the check to $value instanceof Enumerable
, so $value->all()
also covers LazyCollection
instances
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It might not be even worth it to pursue these changes. Using Collection as value is not in the docs (unless someone can share the URL) and Postgres/SQLServer would require different syntax to store JSON
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You're right. And it is easy enough for someone to just add collect(...)->all()
on the call-site
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it's problematic though that the behaviour is somewhat undefined when passing in a collection (or at least very unexpected), especially as I think many devs don't actively differentiate between arrays and collections in Laravel as much Laravel functionality behaves the same no matter what you pass in.
fixes #53226