From 3adce2cfc1d29a8d11bb62096b4560b3b69c967c Mon Sep 17 00:00:00 2001 From: Mohamed Said Date: Tue, 28 Feb 2017 17:15:26 +0200 Subject: [PATCH 1/2] Fix MySQL deletes with JOIN and ALias --- src/Illuminate/Database/Query/Grammars/MySqlGrammar.php | 8 +++++++- tests/Database/DatabaseQueryBuilderTest.php | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php index a8183e6bd445..352c8a65527a 100755 --- a/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php @@ -242,7 +242,13 @@ protected function compileDeleteWithJoins($query, $table, $where) { $joins = ' '.$this->compileJoins($query, $query->joins); - return trim("delete {$table} from {$table}{$joins} {$where}"); + $alias = $table; + + if (strpos(strtolower($table), ' as ') !== false) { + $alias = explode(' as ', $table)[1]; + } + + return trim("delete {$alias} from {$table}{$joins} {$where}"); } /** diff --git a/tests/Database/DatabaseQueryBuilderTest.php b/tests/Database/DatabaseQueryBuilderTest.php index 1f81d2a26e1d..1a9fdf9741bc 100755 --- a/tests/Database/DatabaseQueryBuilderTest.php +++ b/tests/Database/DatabaseQueryBuilderTest.php @@ -1433,6 +1433,11 @@ public function testDeleteWithJoinMethod() $result = $builder->from('users')->join('contacts', 'users.id', '=', 'contacts.id')->where('email', '=', 'foo')->orderBy('id')->limit(1)->delete(); $this->assertEquals(1, $result); + $builder = $this->getMySqlBuilder(); + $builder->getConnection()->shouldReceive('delete')->once()->with('delete `a` from `users` as `a` inner join `users` as `b` on `a`.`id` = `b`.`user_id` where `email` = ?', ['foo'])->andReturn(1); + $result = $builder->from('users AS a')->join('users AS b', 'a.id', '=', 'b.user_id')->where('email', '=', 'foo')->orderBy('id')->limit(1)->delete(); + $this->assertEquals(1, $result); + $builder = $this->getMySqlBuilder(); $builder->getConnection()->shouldReceive('delete')->once()->with('delete `users` from `users` inner join `contacts` on `users`.`id` = `contacts`.`id` where `users`.`id` = ?', [1])->andReturn(1); $result = $builder->from('users')->join('contacts', 'users.id', '=', 'contacts.id')->orderBy('id')->take(1)->delete(1); From 74c4d71188e4c3dc8110092ed9c9a41393ac3b84 Mon Sep 17 00:00:00 2001 From: Mohamed Said Date: Tue, 28 Feb 2017 17:35:44 +0200 Subject: [PATCH 2/2] fix SqlServer compilation for delete with JOINs and using table aliases --- .../Database/Query/Grammars/SqlServerGrammar.php | 8 +++++++- tests/Database/DatabaseQueryBuilderTest.php | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php b/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php index df2064a4e536..729814aa5f09 100755 --- a/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php +++ b/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php @@ -269,7 +269,13 @@ protected function compileDeleteWithJoins(Builder $query, $table, $where) { $joins = ' '.$this->compileJoins($query, $query->joins); - return trim("delete {$table} from {$table}{$joins} {$where}"); + $alias = $table; + + if (strpos(strtolower($table), ' as ') !== false) { + $alias = explode(' as ', $table)[1]; + } + + return trim("delete {$alias} from {$table}{$joins} {$where}"); } /** diff --git a/tests/Database/DatabaseQueryBuilderTest.php b/tests/Database/DatabaseQueryBuilderTest.php index 1a9fdf9741bc..94662dcee54b 100755 --- a/tests/Database/DatabaseQueryBuilderTest.php +++ b/tests/Database/DatabaseQueryBuilderTest.php @@ -1448,6 +1448,11 @@ public function testDeleteWithJoinMethod() $result = $builder->from('users')->join('contacts', 'users.id', '=', 'contacts.id')->where('email', '=', 'foo')->delete(); $this->assertEquals(1, $result); + $builder = $this->getSqlServerBuilder(); + $builder->getConnection()->shouldReceive('delete')->once()->with('delete [a] from [users] as [a] inner join [users] as [b] on [a].[id] = [b].[user_id] where [email] = ?', ['foo'])->andReturn(1); + $result = $builder->from('users AS a')->join('users AS b', 'a.id', '=', 'b.user_id')->where('email', '=', 'foo')->orderBy('id')->limit(1)->delete(); + $this->assertEquals(1, $result); + $builder = $this->getSqlServerBuilder(); $builder->getConnection()->shouldReceive('delete')->once()->with('delete [users] from [users] inner join [contacts] on [users].[id] = [contacts].[id] where [users].[id] = ?', [1])->andReturn(1); $result = $builder->from('users')->join('contacts', 'users.id', '=', 'contacts.id')->delete(1);