From 240bf84f1aeae356c633832cf6ad2833582ed5b0 Mon Sep 17 00:00:00 2001 From: Jonas Staudenmeir Date: Tue, 23 Jul 2019 19:54:51 +0200 Subject: [PATCH 1/2] Fix UPDATE query bindings on PostgreSQL --- src/Illuminate/Database/Query/Grammars/PostgresGrammar.php | 2 +- tests/Database/DatabaseQueryBuilderTest.php | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php b/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php index 5377c803c289..d7598da0151a 100755 --- a/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php +++ b/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php @@ -368,7 +368,7 @@ public function prepareBindingsForUpdate(array $bindings, array $values) // Update statements with "joins" in Postgres use an interesting syntax. We need to // take all of the bindings and put them on the end of this array since they are // added to the end of the "where" clause statements as typical where clauses. - $bindingsWithoutJoin = Arr::except($bindings, 'join'); + $bindingsWithoutJoin = Arr::except($bindings, ['select', 'join']); return array_values( array_merge($values, $bindings['join'], Arr::flatten($bindingsWithoutJoin)) diff --git a/tests/Database/DatabaseQueryBuilderTest.php b/tests/Database/DatabaseQueryBuilderTest.php index e50349e6bf16..efb584294983 100755 --- a/tests/Database/DatabaseQueryBuilderTest.php +++ b/tests/Database/DatabaseQueryBuilderTest.php @@ -1995,6 +1995,11 @@ public function testUpdateMethodWithoutJoinsOnPostgres() $builder->getConnection()->shouldReceive('update')->once()->with('update "users" set "email" = ?, "name" = ? where "id" = ?', ['foo', 'bar', 1])->andReturn(1); $result = $builder->from('users')->where('id', '=', 1)->update(['users.email' => 'foo', 'name' => 'bar']); $this->assertEquals(1, $result); + + $builder = $this->getPostgresBuilder(); + $builder->getConnection()->shouldReceive('update')->once()->with('update "users" set "email" = ?, "name" = ? where "id" = ?', ['foo', 'bar', 1])->andReturn(1); + $result = $builder->from('users')->where('id', '=', 1)->selectRaw('?', ['ignore'])->update(['users.email' => 'foo', 'name' => 'bar']); + $this->assertEquals(1, $result); } public function testUpdateMethodWithJoinsOnPostgres() From 0708161b2079b55a44112fba94500340a1b56792 Mon Sep 17 00:00:00 2001 From: Jonas Staudenmeir Date: Tue, 23 Jul 2019 19:58:41 +0200 Subject: [PATCH 2/2] Simplify UPDATE query bindings --- src/Illuminate/Database/Query/Grammars/Grammar.php | 2 +- src/Illuminate/Database/Query/Grammars/PostgresGrammar.php | 7 ++----- src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php | 4 ++-- .../Database/Query/Grammars/SqlServerGrammar.php | 7 ++----- 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/Illuminate/Database/Query/Grammars/Grammar.php b/src/Illuminate/Database/Query/Grammars/Grammar.php index 7c30c67a14f2..cd1ed736c2cb 100755 --- a/src/Illuminate/Database/Query/Grammars/Grammar.php +++ b/src/Illuminate/Database/Query/Grammars/Grammar.php @@ -942,7 +942,7 @@ public function compileUpdate(Builder $query, $values) */ public function prepareBindingsForUpdate(array $bindings, array $values) { - $cleanBindings = Arr::except($bindings, ['join', 'select']); + $cleanBindings = Arr::except($bindings, ['select', 'join']); return array_values( array_merge($bindings['join'], $values, Arr::flatten($cleanBindings)) diff --git a/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php b/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php index d7598da0151a..cfc92c5d19df 100755 --- a/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php +++ b/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php @@ -365,13 +365,10 @@ public function prepareBindingsForUpdate(array $bindings, array $values) : $value; })->all(); - // Update statements with "joins" in Postgres use an interesting syntax. We need to - // take all of the bindings and put them on the end of this array since they are - // added to the end of the "where" clause statements as typical where clauses. - $bindingsWithoutJoin = Arr::except($bindings, ['select', 'join']); + $cleanBindings = Arr::except($bindings, 'select'); return array_values( - array_merge($values, $bindings['join'], Arr::flatten($bindingsWithoutJoin)) + array_merge($values, Arr::flatten($cleanBindings)) ); } diff --git a/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php b/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php index a0628674557e..a35b6ffb73d2 100755 --- a/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php +++ b/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php @@ -211,10 +211,10 @@ public function compileUpdate(Builder $query, $values) */ public function prepareBindingsForUpdate(array $bindings, array $values) { - $cleanBindings = Arr::except($bindings, ['select', 'join']); + $cleanBindings = Arr::except($bindings, 'select'); return array_values( - array_merge($values, $bindings['join'], Arr::flatten($cleanBindings)) + array_merge($values, Arr::flatten($cleanBindings)) ); } diff --git a/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php b/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php index b53e0bff35c4..56f917a9d712 100755 --- a/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php +++ b/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php @@ -405,13 +405,10 @@ protected function parseUpdateTable($table) */ public function prepareBindingsForUpdate(array $bindings, array $values) { - // Update statements with joins in SQL Servers utilize an unique syntax. We need to - // take all of the bindings and put them on the end of this array since they are - // added to the end of the "where" clause statements as typical where clauses. - $bindingsWithoutJoin = Arr::except($bindings, 'join'); + $cleanBindings = Arr::except($bindings, 'select'); return array_values( - array_merge($values, $bindings['join'], Arr::flatten($bindingsWithoutJoin)) + array_merge($values, Arr::flatten($cleanBindings)) ); }