diff --git a/src/Illuminate/Database/MySqlConnection.php b/src/Illuminate/Database/MySqlConnection.php index 460a4fd375c1..502c6b62782c 100755 --- a/src/Illuminate/Database/MySqlConnection.php +++ b/src/Illuminate/Database/MySqlConnection.php @@ -14,6 +14,47 @@ class MySqlConnection extends Connection { + /** + * The last inserted ID generated by the server + * + * @var string|int|null + */ + protected $lastInsertId; + + /** + * Run an insert statement against the database. + * + * @param string $query + * @param array $bindings + * @param string|null $sequence + * @return bool + */ + public function insert($query, $bindings = [], $sequence = null) + { + return $this->run($query, $bindings, function ($query, $bindings) use ($sequence) { + if ($this->pretending()) { + return true; + } + + $statement = $this->getPdo()->prepare($query); + + $this->bindValues($statement, $this->prepareBindings($bindings)); + + $this->recordsHaveBeenModified(); + + $result = $statement->execute(); + + $this->lastInsertId = $this->getPdo()->lastInsertId($sequence); + + return $result; + }); + } + + public function getLastInsertId() + { + return $this->lastInsertId; + } + /** * Escape a binary value for safe SQL embedding. * diff --git a/src/Illuminate/Database/Query/Processors/MySqlProcessor.php b/src/Illuminate/Database/Query/Processors/MySqlProcessor.php index 07553c39195b..cfbbdc3cec7b 100644 --- a/src/Illuminate/Database/Query/Processors/MySqlProcessor.php +++ b/src/Illuminate/Database/Query/Processors/MySqlProcessor.php @@ -2,6 +2,8 @@ namespace Illuminate\Database\Query\Processors; +use Illuminate\Database\Query\Builder; + class MySqlProcessor extends Processor { /** @@ -19,6 +21,24 @@ public function processColumnListing($results) }, $results); } + /** + * Process an "insert get ID" query. + * + * @param \Illuminate\Database\Query\Builder $query + * @param string $sql + * @param array $values + * @param string|null $sequence + * @return int + */ + public function processInsertGetId(Builder $query, $sql, $values, $sequence = null) + { + $query->getConnection()->insert($sql, $values, $sequence); + + $id = $query->getConnection()->getLastInsertId(); + + return is_numeric($id) ? (int) $id : $id; + } + /** * Process the results of a columns query. * diff --git a/tests/Integration/Database/MySql/DatabaseMySqlConnectionTest.php b/tests/Integration/Database/MySql/DatabaseMySqlConnectionTest.php index 16b067eac3ca..4f5df6d24f74 100644 --- a/tests/Integration/Database/MySql/DatabaseMySqlConnectionTest.php +++ b/tests/Integration/Database/MySql/DatabaseMySqlConnectionTest.php @@ -2,6 +2,7 @@ namespace Illuminate\Tests\Integration\Database\MySql; +use Illuminate\Database\Events\QueryExecuted; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; @@ -151,4 +152,27 @@ public static function jsonContainsKeyDataProvider() 'null value' => [1, 'json_col->bar'], ]; } + + public function testLastInsertIdIsPreserved() + { + if (! Schema::hasTable('auto_id_table')) { + Schema::create('auto_id_table', function (Blueprint $table) { + $table->id(); + }); + } + + try { + static $callbackExecuted = false; + DB::listen(function (QueryExecuted $event) use (&$callbackExecuted) { + DB::getPdo()->query('SELECT 1'); + $callbackExecuted = true; + }); + + $id = DB::table('auto_id_table')->insertGetId([]); + $this->assertTrue($callbackExecuted, 'The query listener was not executed.'); + $this->assertEquals(1, $id); + } finally { + Schema::drop('auto_id_table'); + } + } }