From c14cc77a4a5748ef05fed2a53b068f25d4a910e2 Mon Sep 17 00:00:00 2001 From: Jonas Staudenmeir Date: Thu, 30 Jun 2016 13:44:45 +0200 Subject: [PATCH] Fix MySQL multiple-table DELETE error http://dev.mysql.com/doc/refman/5.7/en/delete.html "You cannot use ORDER BY or LIMIT in a multiple-table DELETE." --- .../Database/Query/Grammars/MySqlGrammar.php | 12 ++++++------ tests/Database/DatabaseQueryBuilderTest.php | 9 +++++++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php index 41f5c85aa074..e48221cc3014 100755 --- a/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php @@ -111,14 +111,14 @@ public function compileDelete(Builder $query) $sql = trim("delete $table from {$table}{$joins} $where"); } else { $sql = trim("delete from $table $where"); - } - if (isset($query->orders)) { - $sql .= ' '.$this->compileOrders($query, $query->orders); - } + if (isset($query->orders)) { + $sql .= ' '.$this->compileOrders($query, $query->orders); + } - if (isset($query->limit)) { - $sql .= ' '.$this->compileLimit($query, $query->limit); + if (isset($query->limit)) { + $sql .= ' '.$this->compileLimit($query, $query->limit); + } } return $sql; diff --git a/tests/Database/DatabaseQueryBuilderTest.php b/tests/Database/DatabaseQueryBuilderTest.php index 64f74b37e8d1..1c16c6d85dab 100755 --- a/tests/Database/DatabaseQueryBuilderTest.php +++ b/tests/Database/DatabaseQueryBuilderTest.php @@ -1094,18 +1094,23 @@ public function testDeleteMethod() $builder->getConnection()->shouldReceive('delete')->once()->with('delete from "users" where "id" = ?', [1])->andReturn(1); $result = $builder->from('users')->delete(1); $this->assertEquals(1, $result); + + $builder = $this->getMySqlBuilder(); + $builder->getConnection()->shouldReceive('delete')->once()->with('delete from `users` where `email` = ? order by `id` asc limit 1', ['foo'])->andReturn(1); + $result = $builder->from('users')->where('email', '=', 'foo')->orderBy('id')->take(1)->delete(); + $this->assertEquals(1, $result); } public function testDeleteWithJoinMethod() { $builder = $this->getMySqlBuilder(); $builder->getConnection()->shouldReceive('delete')->once()->with('delete `users` from `users` inner join `contacts` on `users`.`id` = `contacts`.`id` where `email` = ?', ['foo'])->andReturn(1); - $result = $builder->from('users')->join('contacts', 'users.id', '=', 'contacts.id')->where('email', '=', 'foo')->delete(); + $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 `users` from `users` inner join `contacts` on `users`.`id` = `contacts`.`id` where `id` = ?', [1])->andReturn(1); - $result = $builder->from('users')->join('contacts', 'users.id', '=', 'contacts.id')->delete(1); + $result = $builder->from('users')->join('contacts', 'users.id', '=', 'contacts.id')->orderBy('id')->take(1)->delete(1); $this->assertEquals(1, $result); }