staudenmeir / laravel-cte

Laravel queries with common table expressions
MIT License
513 stars 38 forks source link

Binding order wrong while updating with a join in expression #59

Open gisostallenberg opened 1 week ago

gisostallenberg commented 1 week ago

If an expression contains a join the update bindings are wrongly ordered.

The following patch is a fix for this:

--- /dev/null
+++ ../src/Query/Grammars/Traits/CompilesExpressions.php
@@ -3,6 +3,7 @@
 namespace Staudenmeir\LaravelCte\Query\Grammars\Traits;

 use Illuminate\Database\Query\Builder;
+use Illuminate\Support\Arr;
 use Illuminate\Support\Str;
 use Staudenmeir\LaravelCte\Query\Builder as CteBuilder;
 use Staudenmeir\LaravelCte\Query\FirebirdBuilder;
@@ -169,11 +170,11 @@
      */
     public function prepareBindingsForUpdate(array $bindings, array $values)
     {
-        $values = array_merge($bindings['expressions'], $values);
+        $cleanBindings = Arr::except($bindings, ['select', 'join', 'expressions']);

-        unset($bindings['expressions']);
-
-        return parent::prepareBindingsForUpdate($bindings, $values);
+        return array_values(
+            array_merge($bindings['join'], $bindings['expressions'], $values, Arr::flatten($cleanBindings))
+        );
     }

     /**
staudenmeir commented 1 week ago

Hi @gisostallenberg, Thanks for reporting this. What does your query look like? What database are you using?