diff --git a/src/Illuminate/Database/Connection.php b/src/Illuminate/Database/Connection.php index 15dfae18c221..ac41c219440f 100755 --- a/src/Illuminate/Database/Connection.php +++ b/src/Illuminate/Database/Connection.php @@ -1716,4 +1716,19 @@ public static function getResolver($driver) { return static::$resolvers[$driver] ?? null; } + + /** + * Prepare the instance for cloning. + * + * @return void + */ + public function __clone() + { + // When cloning, re-initialize grammars to reference cloned connection... + $this->useDefaultQueryGrammar(); + + if (! is_null($this->schemaGrammar)) { + $this->useDefaultSchemaGrammar(); + } + } } diff --git a/tests/Database/DatabaseEloquentIntegrationWithTablePrefixTest.php b/tests/Database/DatabaseEloquentIntegrationWithTablePrefixTest.php index f8513dea95c8..7341f88d5cf9 100644 --- a/tests/Database/DatabaseEloquentIntegrationWithTablePrefixTest.php +++ b/tests/Database/DatabaseEloquentIntegrationWithTablePrefixTest.php @@ -93,6 +93,53 @@ public function testBasicModelHydration() $this->assertCount(1, $models); } + public function testTablePrefixWithClonedConnection() + { + $originalConnection = $this->connection(); + $originalPrefix = $originalConnection->getTablePrefix(); + + $clonedConnection = clone $originalConnection; + $clonedConnection->setTablePrefix('cloned_'); + + $this->assertSame($originalPrefix, $originalConnection->getTablePrefix()); + $this->assertSame('cloned_', $clonedConnection->getTablePrefix()); + + $clonedConnection->getSchemaBuilder()->create('test_table', function ($table) { + $table->increments('id'); + $table->string('name'); + }); + + $this->assertTrue($clonedConnection->getSchemaBuilder()->hasTable('test_table')); + $query = $clonedConnection->table('test_table')->toSql(); + $this->assertStringContainsString('cloned_test_table', $query); + + $clonedConnection->getSchemaBuilder()->drop('test_table'); + } + + public function testQueryGrammarUsesCorrectPrefixAfterCloning() + { + $originalConnection = $this->connection(); + + $clonedConnection = clone $originalConnection; + $clonedConnection->setTablePrefix('new_prefix_'); + + $selectSql = $clonedConnection->table('users')->toSql(); + $this->assertStringContainsString('new_prefix_users', $selectSql); + + $insertSql = $clonedConnection->table('users')->toSql(); + $this->assertStringContainsString('new_prefix_users', $insertSql); + + $updateSql = $clonedConnection->table('users')->where('id', 1)->toSql(); + $this->assertStringContainsString('new_prefix_users', $updateSql); + + $deleteSql = $clonedConnection->table('users')->where('id', 1)->toSql(); + $this->assertStringContainsString('new_prefix_users', $deleteSql); + + $originalSql = $originalConnection->table('users')->toSql(); + $this->assertStringContainsString('prefix_users', $originalSql); + $this->assertStringNotContainsString('new_prefix_users', $originalSql); + } + /** * Helpers... */