From 0137b4203bd092e34eb2a678c1f392ee1a6b8a49 Mon Sep 17 00:00:00 2001 From: Hafez Divandari Date: Thu, 6 Feb 2025 05:28:51 +0330 Subject: [PATCH 1/4] fix connection references --- config/database.php | 1 + src/Illuminate/Database/Connection.php | 21 +-- src/Illuminate/Database/Grammar.php | 48 +++--- src/Illuminate/Database/MariaDbConnection.php | 8 +- src/Illuminate/Database/MySqlConnection.php | 8 +- .../Database/PostgresConnection.php | 8 +- .../Database/Query/Grammars/SQLiteGrammar.php | 4 +- src/Illuminate/Database/SQLiteConnection.php | 8 +- src/Illuminate/Database/Schema/Blueprint.php | 32 ++-- .../Database/Schema/BlueprintState.php | 12 +- src/Illuminate/Database/Schema/Builder.php | 31 +--- .../Database/Schema/Grammars/Grammar.php | 29 ++-- .../Schema/Grammars/MariaDbGrammar.php | 10 +- .../Database/Schema/Grammars/MySqlGrammar.php | 87 ++++------ .../Schema/Grammars/PostgresGrammar.php | 45 ++---- .../Schema/Grammars/SQLiteGrammar.php | 34 ++-- .../Schema/Grammars/SqlServerGrammar.php | 38 +---- .../Database/Schema/MySqlBuilder.php | 26 --- .../Database/Schema/PostgresBuilder.php | 26 --- .../Database/Schema/SQLiteBuilder.php | 4 +- .../Database/Schema/SqlServerBuilder.php | 26 --- .../Database/SqlServerConnection.php | 8 +- src/Illuminate/Support/Facades/DB.php | 1 - .../DatabaseAbstractSchemaGrammarTest.php | 16 +- ...EloquentBelongsToManyCreateOrFirstTest.php | 8 +- ...tabaseEloquentBuilderCreateOrFirstTest.php | 8 +- .../Database/DatabaseEloquentBuilderTest.php | 40 +++-- ...tabaseEloquentHasManyCreateOrFirstTest.php | 8 +- ...loquentHasManyThroughCreateOrFirstTest.php | 8 +- tests/Database/DatabaseMariaDbBuilderTest.php | 10 +- .../DatabaseMariaDbQueryGrammarTest.php | 3 +- .../DatabaseMariaDbSchemaGrammarTest.php | 28 ++-- tests/Database/DatabaseMySqlBuilderTest.php | 8 +- .../DatabaseMySqlQueryGrammarTest.php | 3 +- .../DatabaseMySqlSchemaGrammarTest.php | 24 +-- .../Database/DatabasePostgresBuilderTest.php | 8 +- .../DatabasePostgresQueryGrammarTest.php | 11 +- .../DatabasePostgresSchemaGrammarTest.php | 37 +++-- tests/Database/DatabaseQueryBuilderTest.php | 151 +++++++++--------- tests/Database/DatabaseQueryGrammarTest.php | 5 +- .../DatabaseSQLiteQueryGrammarTest.php | 3 +- .../DatabaseSQLiteSchemaGrammarTest.php | 2 +- .../Database/DatabaseSchemaBlueprintTest.php | 151 ++++++++---------- tests/Database/DatabaseSchemaBuilderTest.php | 14 +- .../DatabaseSqlServerQueryGrammarTest.php | 3 +- .../DatabaseSqlServerSchemaGrammarTest.php | 27 ++-- tests/Database/SqlServerBuilderTest.php | 8 +- .../Sqlite/DatabaseSchemaBlueprintTest.php | 75 +++++---- 48 files changed, 470 insertions(+), 704 deletions(-) diff --git a/config/database.php b/config/database.php index 125949ed5a1..1b1ce4d9900 100644 --- a/config/database.php +++ b/config/database.php @@ -36,6 +36,7 @@ 'url' => env('DB_URL'), 'database' => env('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', + 'prefix_indexes' => null, 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), 'busy_timeout' => null, 'journal_mode' => null, diff --git a/src/Illuminate/Database/Connection.php b/src/Illuminate/Database/Connection.php index 8dd7213117c..69780f78a2b 100755 --- a/src/Illuminate/Database/Connection.php +++ b/src/Illuminate/Database/Connection.php @@ -248,9 +248,7 @@ public function useDefaultQueryGrammar() */ protected function getDefaultQueryGrammar() { - ($grammar = new QueryGrammar)->setConnection($this); - - return $grammar; + return new QueryGrammar($this); } /** @@ -1626,26 +1624,9 @@ public function setTablePrefix($prefix) { $this->tablePrefix = $prefix; - $this->getQueryGrammar()->setTablePrefix($prefix); - return $this; } - /** - * Set the table prefix and return the grammar. - * - * @template TGrammar of \Illuminate\Database\Grammar - * - * @param TGrammar $grammar - * @return TGrammar - */ - public function withTablePrefix(Grammar $grammar) - { - $grammar->setTablePrefix($this->tablePrefix); - - return $grammar; - } - /** * Execute the given callback without table prefix. * diff --git a/src/Illuminate/Database/Grammar.php b/src/Illuminate/Database/Grammar.php index 187d1348ad3..33ed9fbc6f3 100755 --- a/src/Illuminate/Database/Grammar.php +++ b/src/Illuminate/Database/Grammar.php @@ -19,11 +19,15 @@ abstract class Grammar protected $connection; /** - * The grammar table prefix. + * Create a new grammar instance. * - * @var string + * @param \Illuminate\Database\Connection $connection + * @return void */ - protected $tablePrefix = ''; + public function __construct(Connection $connection) + { + $this->connection = $connection; + } /** * Wrap an array of values. @@ -49,15 +53,15 @@ public function wrapTable($table, $prefix = null) return $this->getValue($table); } + $prefix ??= $this->connection->getTablePrefix(); + // If the table being wrapped has an alias we'll need to separate the pieces // so we can prefix the table and then wrap each of the segments on their // own and then join these both back together using the "as" connector. if (stripos($table, ' as ') !== false) { - return $this->wrapAliasedTable($table); + return $this->wrapAliasedTable($table, $prefix); } - $prefix ??= $this->tablePrefix; - // If the table being wrapped has a custom schema name specified, we need to // prefix the last segment as the table name then wrap each segment alone // and eventually join them both back together using the dot connector. @@ -118,13 +122,16 @@ protected function wrapAliasedValue($value) * Wrap a table that has an alias. * * @param string $value + * @param string|null $prefix * @return string */ - protected function wrapAliasedTable($value) + protected function wrapAliasedTable($value, $prefix = null) { $segments = preg_split('/\s+as\s+/i', $value); - return $this->wrapTable($segments[0]).' as '.$this->wrapValue($this->tablePrefix.$segments[1]); + $prefix ??= $this->connection->getTablePrefix(); + + return $this->wrapTable($segments[0], $prefix).' as '.$this->wrapValue($prefix.$segments[1]); } /** @@ -238,10 +245,6 @@ public function quoteString($value) */ public function escape($value, $binary = false) { - if (is_null($this->connection)) { - throw new RuntimeException("The database driver's grammar implementation does not support escaping values."); - } - return $this->connection->escape($value, $binary); } @@ -284,35 +287,26 @@ public function getDateFormat() /** * Get the grammar's table prefix. * + * @deprected Use DB::getTablePrefix() + * * @return string */ public function getTablePrefix() { - return $this->tablePrefix; + return $this->connection->getTablePrefix(); } /** * Set the grammar's table prefix. * + * @deprected DB::setTablePrefix() + * * @param string $prefix * @return $this */ public function setTablePrefix($prefix) { - $this->tablePrefix = $prefix; - - return $this; - } - - /** - * Set the grammar's database connection. - * - * @param \Illuminate\Database\Connection $connection - * @return $this - */ - public function setConnection($connection) - { - $this->connection = $connection; + $this->connection->setTablePrefix($prefix); return $this; } diff --git a/src/Illuminate/Database/MariaDbConnection.php b/src/Illuminate/Database/MariaDbConnection.php index ebd33a15b9b..c4040b6c34a 100755 --- a/src/Illuminate/Database/MariaDbConnection.php +++ b/src/Illuminate/Database/MariaDbConnection.php @@ -47,9 +47,7 @@ public function getServerVersion(): string */ protected function getDefaultQueryGrammar() { - ($grammar = new QueryGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); + return new QueryGrammar($this); } /** @@ -73,9 +71,7 @@ public function getSchemaBuilder() */ protected function getDefaultSchemaGrammar() { - ($grammar = new SchemaGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); + return new SchemaGrammar($this); } /** diff --git a/src/Illuminate/Database/MySqlConnection.php b/src/Illuminate/Database/MySqlConnection.php index abc1edb4f83..54c1aff0b7e 100755 --- a/src/Illuminate/Database/MySqlConnection.php +++ b/src/Illuminate/Database/MySqlConnection.php @@ -121,9 +121,7 @@ public function getServerVersion(): string */ protected function getDefaultQueryGrammar() { - ($grammar = new QueryGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); + return new QueryGrammar($this); } /** @@ -147,9 +145,7 @@ public function getSchemaBuilder() */ protected function getDefaultSchemaGrammar() { - ($grammar = new SchemaGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); + return new SchemaGrammar($this); } /** diff --git a/src/Illuminate/Database/PostgresConnection.php b/src/Illuminate/Database/PostgresConnection.php index 06fa2e1d8e4..f80b5dce5df 100755 --- a/src/Illuminate/Database/PostgresConnection.php +++ b/src/Illuminate/Database/PostgresConnection.php @@ -62,9 +62,7 @@ protected function isUniqueConstraintError(Exception $exception) */ protected function getDefaultQueryGrammar() { - ($grammar = new QueryGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); + return new QueryGrammar($this); } /** @@ -88,9 +86,7 @@ public function getSchemaBuilder() */ protected function getDefaultSchemaGrammar() { - ($grammar = new SchemaGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); + return new SchemaGrammar($this); } /** diff --git a/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php b/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php index 6dc65a07c03..e3983855e6b 100755 --- a/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php +++ b/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php @@ -439,12 +439,12 @@ protected function compileDeleteWithJoinsOrLimit(Builder $query) */ public function compileTruncate(Builder $query) { - [$schema, $table] = $this->connection->getSchemaBuilder()->parseSchemaAndTable($query->from); + [$schema, $table] = $query->getConnection()->getSchemaBuilder()->parseSchemaAndTable($query->from); $schema = $schema ? $this->wrapValue($schema).'.' : ''; return [ - 'delete from '.$schema.'sqlite_sequence where name = ?' => [$this->getTablePrefix().$table], + 'delete from '.$schema.'sqlite_sequence where name = ?' => [$query->getConnection()->getTablePrefix().$table], 'delete from '.$this->wrapTable($query->from) => [], ]; } diff --git a/src/Illuminate/Database/SQLiteConnection.php b/src/Illuminate/Database/SQLiteConnection.php index bccd3311811..997afb3934e 100755 --- a/src/Illuminate/Database/SQLiteConnection.php +++ b/src/Illuminate/Database/SQLiteConnection.php @@ -162,9 +162,7 @@ protected function isUniqueConstraintError(Exception $exception) */ protected function getDefaultQueryGrammar() { - ($grammar = new QueryGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); + return new QueryGrammar($this); } /** @@ -188,9 +186,7 @@ public function getSchemaBuilder() */ protected function getDefaultSchemaGrammar() { - ($grammar = new SchemaGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); + return new SchemaGrammar($this); } /** diff --git a/src/Illuminate/Database/Schema/Blueprint.php b/src/Illuminate/Database/Schema/Blueprint.php index 729a7dce67e..5be9ff05b19 100755 --- a/src/Illuminate/Database/Schema/Blueprint.php +++ b/src/Illuminate/Database/Schema/Blueprint.php @@ -34,13 +34,6 @@ class Blueprint */ protected $table; - /** - * The prefix of the table. - * - * @var string - */ - protected $prefix; - /** * The columns that should be added to the table. * @@ -103,15 +96,13 @@ class Blueprint * @param \Illuminate\Database\Connection $connection * @param string $table * @param \Closure|null $callback - * @param string $prefix * @return void */ - public function __construct(Connection $connection, $table, ?Closure $callback = null, $prefix = '') + public function __construct(Connection $connection, $table, ?Closure $callback = null) { $this->connection = $connection; $this->grammar = $connection->getSchemaGrammar(); $this->table = $table; - $this->prefix = $prefix; if (! is_null($callback)) { $callback($this); @@ -158,7 +149,7 @@ public function toSql() $this->state->update($command); } - if (! is_null($sql = $this->grammar->$method($this, $command, $this->connection))) { + if (! is_null($sql = $this->grammar->$method($this, $command))) { $statements = array_merge($statements, (array) $sql); } } @@ -290,7 +281,7 @@ public function addAlterCommands() return; } - $alterCommands = $this->grammar->getAlterCommands($this->connection); + $alterCommands = $this->grammar->getAlterCommands(); [$commands, $lastCommandWasAlter, $hasAlterCommand] = [ [], false, false, @@ -313,7 +304,7 @@ public function addAlterCommands() } if ($hasAlterCommand) { - $this->state = new BlueprintState($this, $this->connection, $this->grammar); + $this->state = new BlueprintState($this, $this->connection); } $this->commands = $commands; @@ -1703,9 +1694,13 @@ protected function dropIndexCommand($command, $type, $index) */ protected function createIndexName($type, array $columns) { - $table = str_contains($this->table, '.') - ? substr_replace($this->table, '.'.$this->prefix, strrpos($this->table, '.'), 1) - : $this->prefix.$this->table; + $table = $this->table; + + if ($this->connection->getConfig('prefix_indexes')) { + $table = str_contains($this->table, '.') + ? substr_replace($this->table, '.'.$this->connection->getTablePrefix(), strrpos($this->table, '.'), 1) + : $this->connection->getTablePrefix().$this->table; + } $index = strtolower($table.'_'.implode('_', $columns).'_'.$type); @@ -1824,11 +1819,13 @@ public function getTable() /** * Get the table prefix. * + * @deprected Use DB::getTablePrefix() + * * @return string */ public function getPrefix() { - return $this->prefix; + return $this->connection->getTablePrefix(); } /** @@ -1854,7 +1851,6 @@ public function getCommands() /** * Determine if the blueprint has state. * - * @param mixed $name * @return bool */ private function hasState(): bool diff --git a/src/Illuminate/Database/Schema/BlueprintState.php b/src/Illuminate/Database/Schema/BlueprintState.php index 4a2ea127a97..c804e778fd8 100644 --- a/src/Illuminate/Database/Schema/BlueprintState.php +++ b/src/Illuminate/Database/Schema/BlueprintState.php @@ -4,7 +4,6 @@ use Illuminate\Database\Connection; use Illuminate\Database\Query\Expression; -use Illuminate\Database\Schema\Grammars\Grammar; use Illuminate\Support\Collection; use Illuminate\Support\Fluent; use Illuminate\Support\Str; @@ -25,13 +24,6 @@ class BlueprintState */ protected $connection; - /** - * The grammar instance. - * - * @var \Illuminate\Database\Schema\Grammars\Grammar - */ - protected $grammar; - /** * The columns. * @@ -65,14 +57,12 @@ class BlueprintState * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Database\Connection $connection - * @param \Illuminate\Database\Schema\Grammars\Grammar $grammar * @return void */ - public function __construct(Blueprint $blueprint, Connection $connection, Grammar $grammar) + public function __construct(Blueprint $blueprint, Connection $connection) { $this->blueprint = $blueprint; $this->connection = $connection; - $this->grammar = $grammar; $schema = $connection->getSchemaBuilder(); $table = $blueprint->getTable(); diff --git a/src/Illuminate/Database/Schema/Builder.php b/src/Illuminate/Database/Schema/Builder.php index a42f9f28802..5f1fa7afc69 100755 --- a/src/Illuminate/Database/Schema/Builder.php +++ b/src/Illuminate/Database/Schema/Builder.php @@ -126,12 +126,12 @@ public static function morphUsingUlids() * * @param string $name * @return bool - * - * @throws \LogicException */ public function createDatabase($name) { - throw new LogicException('This database driver does not support creating databases.'); + return $this->connection->statement( + $this->grammar->compileCreateDatabase($name) + ); } /** @@ -139,12 +139,12 @@ public function createDatabase($name) * * @param string $name * @return bool - * - * @throws \LogicException */ public function dropDatabaseIfExists($name) { - throw new LogicException('This database driver does not support dropping databases.'); + return $this->connection->statement( + $this->grammar->compileDropDatabaseIfExists($name) + ); } /** @@ -630,13 +630,11 @@ protected function createBlueprint($table, ?Closure $callback = null) { $connection = $this->connection; - $prefix = $connection->getConfig('prefix_indexes') ? $connection->getConfig('prefix') : ''; - if (isset($this->resolver)) { - return call_user_func($this->resolver, $connection, $table, $callback, $prefix); + return call_user_func($this->resolver, $connection, $table, $callback); } - return Container::getInstance()->make(Blueprint::class, compact('connection', 'table', 'callback', 'prefix')); + return Container::getInstance()->make(Blueprint::class, compact('connection', 'table', 'callback')); } /** @@ -698,19 +696,6 @@ public function getConnection() return $this->connection; } - /** - * Set the database connection instance. - * - * @param \Illuminate\Database\Connection $connection - * @return $this - */ - public function setConnection(Connection $connection) - { - $this->connection = $connection; - - return $this; - } - /** * Set the Schema Blueprint resolver callback. * diff --git a/src/Illuminate/Database/Schema/Grammars/Grammar.php b/src/Illuminate/Database/Schema/Grammars/Grammar.php index fd78be04e96..92ccf334ad8 100755 --- a/src/Illuminate/Database/Schema/Grammars/Grammar.php +++ b/src/Illuminate/Database/Schema/Grammars/Grammar.php @@ -5,11 +5,9 @@ use BackedEnum; use Illuminate\Contracts\Database\Query\Expression; use Illuminate\Database\Concerns\CompilesJsonPaths; -use Illuminate\Database\Connection; use Illuminate\Database\Grammar as BaseGrammar; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Fluent; -use LogicException; use RuntimeException; abstract class Grammar extends BaseGrammar @@ -41,27 +39,26 @@ abstract class Grammar extends BaseGrammar * Compile a create database command. * * @param string $name - * @param \Illuminate\Database\Connection $connection - * @return void - * - * @throws \LogicException + * @return string */ - public function compileCreateDatabase($name, $connection) + public function compileCreateDatabase($name) { - throw new LogicException('This database driver does not support creating databases.'); + return sprintf('create database %s', + $this->wrapValue($name), + ); } /** * Compile a drop database if exists command. * * @param string $name - * @return void - * - * @throws \LogicException + * @return string */ public function compileDropDatabaseIfExists($name) { - throw new LogicException('This database driver does not support dropping databases.'); + return sprintf('drop database if exists %s', + $this->wrapValue($name) + ); } /** @@ -172,10 +169,9 @@ public function compileForeignKeys($schema, $table) * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection * @return array|string */ - public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) + public function compileRenameColumn(Blueprint $blueprint, Fluent $command) { return sprintf('alter table %s rename column %s to %s', $this->wrapTable($blueprint), @@ -189,14 +185,13 @@ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Conne * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection * @return array|string * * @throws \RuntimeException */ - public function compileChange(Blueprint $blueprint, Fluent $command, Connection $connection) + public function compileChange(Blueprint $blueprint, Fluent $command) { - throw new LogicException('This database driver does not support modifying columns.'); + throw new RuntimeException('This database driver does not support modifying columns.'); } /** diff --git a/src/Illuminate/Database/Schema/Grammars/MariaDbGrammar.php b/src/Illuminate/Database/Schema/Grammars/MariaDbGrammar.php index 2996406a27f..5bf769843e6 100755 --- a/src/Illuminate/Database/Schema/Grammars/MariaDbGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/MariaDbGrammar.php @@ -2,7 +2,6 @@ namespace Illuminate\Database\Schema\Grammars; -use Illuminate\Database\Connection; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Fluent; @@ -13,16 +12,15 @@ class MariaDbGrammar extends MySqlGrammar * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection * @return array|string */ - public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) + public function compileRenameColumn(Blueprint $blueprint, Fluent $command) { - if (version_compare($connection->getServerVersion(), '10.5.2', '<')) { - return $this->compileLegacyRenameColumn($blueprint, $command, $connection); + if (version_compare($this->connection->getServerVersion(), '10.5.2', '<')) { + return $this->compileLegacyRenameColumn($blueprint, $command); } - return parent::compileRenameColumn($blueprint, $command, $connection); + return parent::compileRenameColumn($blueprint, $command); } /** diff --git a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php index 5012fa4d48d..938a18856e3 100755 --- a/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php @@ -2,7 +2,6 @@ namespace Illuminate\Database\Schema\Grammars; -use Illuminate\Database\Connection; use Illuminate\Database\Query\Expression; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\ColumnDefinition; @@ -40,41 +39,21 @@ class MySqlGrammar extends Grammar * Compile a create database command. * * @param string $name - * @param \Illuminate\Database\Connection $connection * @return string */ - public function compileCreateDatabase($name, $connection) + public function compileCreateDatabase($name) { - $charset = $connection->getConfig('charset'); - $collation = $connection->getConfig('collation'); + $sql = parent::compileCreateDatabase($name); - if (! $charset || ! $collation) { - return sprintf( - 'create database %s', - $this->wrapValue($name), - ); + if ($charset = $this->connection->getConfig('charset')) { + $sql .= sprintf(' default character set %s', $this->wrapValue($charset)); } - return sprintf( - 'create database %s default character set %s default collate %s', - $this->wrapValue($name), - $this->wrapValue($charset), - $this->wrapValue($collation), - ); - } + if ($collation = $this->connection->getConfig('collation')) { + $sql .= sprintf(' default collate %s', $this->wrapValue($collation)); + } - /** - * Compile a drop database if exists command. - * - * @param string $name - * @return string - */ - public function compileDropDatabaseIfExists($name) - { - return sprintf( - 'drop database if exists %s', - $this->wrapValue($name) - ); + return $sql; } /** @@ -225,26 +204,25 @@ public function compileForeignKeys($schema, $table) * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection * @return string */ - public function compileCreate(Blueprint $blueprint, Fluent $command, Connection $connection) + public function compileCreate(Blueprint $blueprint, Fluent $command) { $sql = $this->compileCreateTable( - $blueprint, $command, $connection + $blueprint, $command ); // Once we have the primary SQL, we can add the encoding option to the SQL for // the table. Then, we can check if a storage engine has been supplied for // the table. If so, we will add the engine declaration to the SQL query. $sql = $this->compileCreateEncoding( - $sql, $connection, $blueprint + $sql, $blueprint ); // Finally, we will append the engine configuration onto this SQL statement as // the final thing we do before returning this finished SQL. Once this gets // added the query will be ready to execute against the real connections. - return $this->compileCreateEngine($sql, $connection, $blueprint); + return $this->compileCreateEngine($sql, $blueprint); } /** @@ -252,10 +230,9 @@ public function compileCreate(Blueprint $blueprint, Fluent $command, Connection * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection * @return string */ - protected function compileCreateTable($blueprint, $command, $connection) + protected function compileCreateTable($blueprint, $command) { $tableStructure = $this->getColumns($blueprint); @@ -280,18 +257,17 @@ protected function compileCreateTable($blueprint, $command, $connection) * Append the character set specifications to a command. * * @param string $sql - * @param \Illuminate\Database\Connection $connection * @param \Illuminate\Database\Schema\Blueprint $blueprint * @return string */ - protected function compileCreateEncoding($sql, Connection $connection, Blueprint $blueprint) + protected function compileCreateEncoding($sql, Blueprint $blueprint) { // First we will set the character set if one has been set on either the create // blueprint itself or on the root configuration for the connection that the // table is being created on. We will add these to the create table query. if (isset($blueprint->charset)) { $sql .= ' default character set '.$blueprint->charset; - } elseif (! is_null($charset = $connection->getConfig('charset'))) { + } elseif (! is_null($charset = $this->connection->getConfig('charset'))) { $sql .= ' default character set '.$charset; } @@ -300,7 +276,7 @@ protected function compileCreateEncoding($sql, Connection $connection, Blueprint // connection that the query is targeting. We'll add it to this SQL query. if (isset($blueprint->collation)) { $sql .= " collate '{$blueprint->collation}'"; - } elseif (! is_null($collation = $connection->getConfig('collation'))) { + } elseif (! is_null($collation = $this->connection->getConfig('collation'))) { $sql .= " collate '{$collation}'"; } @@ -311,15 +287,14 @@ protected function compileCreateEncoding($sql, Connection $connection, Blueprint * Append the engine specifications to a command. * * @param string $sql - * @param \Illuminate\Database\Connection $connection * @param \Illuminate\Database\Schema\Blueprint $blueprint * @return string */ - protected function compileCreateEngine($sql, Connection $connection, Blueprint $blueprint) + protected function compileCreateEngine($sql, Blueprint $blueprint) { if (isset($blueprint->engine)) { return $sql.' engine = '.$blueprint->engine; - } elseif (! is_null($engine = $connection->getConfig('engine'))) { + } elseif (! is_null($engine = $this->connection->getConfig('engine'))) { return $sql.' engine = '.$engine; } @@ -361,19 +336,19 @@ public function compileAutoIncrementStartingValues(Blueprint $blueprint, Fluent * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection * @return array|string */ - public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) + public function compileRenameColumn(Blueprint $blueprint, Fluent $command) { - $version = $connection->getServerVersion(); + $isMaria = $this->connection->isMaria(); + $version = $this->connection->getServerVersion(); - if (($connection->isMaria() && version_compare($version, '10.5.2', '<')) || - (! $connection->isMaria() && version_compare($version, '8.0.3', '<'))) { - return $this->compileLegacyRenameColumn($blueprint, $command, $connection); + if (($isMaria && version_compare($version, '10.5.2', '<')) || + (! $isMaria && version_compare($version, '8.0.3', '<'))) { + return $this->compileLegacyRenameColumn($blueprint, $command); } - return parent::compileRenameColumn($blueprint, $command, $connection); + return parent::compileRenameColumn($blueprint, $command); } /** @@ -381,12 +356,11 @@ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Conne * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection * @return string */ - protected function compileLegacyRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) + protected function compileLegacyRenameColumn(Blueprint $blueprint, Fluent $command) { - $column = (new Collection($connection->getSchemaBuilder()->getColumns($blueprint->getTable()))) + $column = (new Collection($this->connection->getSchemaBuilder()->getColumns($blueprint->getTable()))) ->firstWhere('name', $command->from); $modifiers = $this->addModifiers($column['type'], $blueprint, new ColumnDefinition([ @@ -425,12 +399,9 @@ protected function compileLegacyRenameColumn(Blueprint $blueprint, Fluent $comma * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection * @return array|string - * - * @throws \RuntimeException */ - public function compileChange(Blueprint $blueprint, Fluent $command, Connection $connection) + public function compileChange(Blueprint $blueprint, Fluent $command) { $column = $command->column; @@ -1117,7 +1088,7 @@ protected function typeGeometry(Fluent $column) return sprintf('%s%s', $subtype ?? 'geometry', match (true) { - $column->srid && $this->connection?->isMaria() => ' ref_system_id='.$column->srid, + $column->srid && $this->connection->isMaria() => ' ref_system_id='.$column->srid, (bool) $column->srid => ' srid '.$column->srid, default => '', } diff --git a/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php b/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php index 8a2ccb2cff1..21a5863f305 100755 --- a/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php @@ -2,7 +2,6 @@ namespace Illuminate\Database\Schema\Grammars; -use Illuminate\Database\Connection; use Illuminate\Database\Query\Expression; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Collection; @@ -43,30 +42,17 @@ class PostgresGrammar extends Grammar * Compile a create database command. * * @param string $name - * @param \Illuminate\Database\Connection $connection * @return string */ - public function compileCreateDatabase($name, $connection) + public function compileCreateDatabase($name) { - return sprintf( - 'create database %s encoding %s', - $this->wrapValue($name), - $this->wrapValue($connection->getConfig('charset')), - ); - } + $sql = parent::compileCreateDatabase($name); - /** - * Compile a drop database if exists command. - * - * @param string $name - * @return string - */ - public function compileDropDatabaseIfExists($name) - { - return sprintf( - 'drop database if exists %s', - $this->wrapValue($name) - ); + if ($charset = $this->connection->getConfig('charset')) { + $sql .= sprintf(' encoding %s', $this->wrapValue($charset)); + } + + return $sql; } /** @@ -175,7 +161,7 @@ public function compileColumns($schema, $table) .'(select tc.collcollate from pg_catalog.pg_collation tc where tc.oid = a.attcollation) as collation, ' .'not a.attnotnull as nullable, ' .'(select pg_get_expr(adbin, adrelid) from pg_attrdef where c.oid = pg_attrdef.adrelid and pg_attrdef.adnum = a.attnum) as default, ' - .(version_compare($this->connection?->getServerVersion(), '12.0', '<') ? "'' as generated, " : 'a.attgenerated as generated, ') + .(version_compare($this->connection->getServerVersion(), '12.0', '<') ? "'' as generated, " : 'a.attgenerated as generated, ') .'col_description(c.oid, a.attnum) as comment ' .'from pg_attribute a, pg_class c, pg_type t, pg_namespace n ' .'where c.relname = %s and n.nspname = %s and a.attnum > 0 and a.attrelid = c.oid and a.atttypid = t.oid and n.oid = c.relnamespace ' @@ -283,9 +269,11 @@ public function compileAutoIncrementStartingValues(Blueprint $blueprint, Fluent { if ($command->column->autoIncrement && $value = $command->column->get('startingValue', $command->column->get('from'))) { - $table = last(explode('.', $blueprint->getTable())); + [$schema, $table] = $this->connection->getSchemaBuilder()->parseSchemaAndTable($blueprint->getTable()); + + $table = ($schema ? $schema.'.' : '').$this->connection->getTablePrefix().$table; - return 'alter sequence '.$blueprint->getPrefix().$table.'_'.$command->column->name.'_seq restart with '.$value; + return 'alter sequence '.$table.'_'.$command->column->name.'_seq restart with '.$value; } } @@ -294,12 +282,9 @@ public function compileAutoIncrementStartingValues(Blueprint $blueprint, Fluent * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection * @return array|string - * - * @throws \RuntimeException */ - public function compileChange(Blueprint $blueprint, Fluent $command, Connection $connection) + public function compileChange(Blueprint $blueprint, Fluent $command) { $column = $command->column; @@ -537,8 +522,8 @@ public function compileDropColumn(Blueprint $blueprint, Fluent $command) */ public function compileDropPrimary(Blueprint $blueprint, Fluent $command) { - $table = last(explode('.', $blueprint->getTable())); - $index = $this->wrap("{$blueprint->getPrefix()}{$table}_pkey"); + [, $table] = $this->connection->getSchemaBuilder()->parseSchemaAndTable($blueprint->getTable()); + $index = $this->wrap("{$this->connection->getTablePrefix()}{$table}_pkey"); return 'alter table '.$this->wrapTable($blueprint)." drop constraint {$index}"; } diff --git a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php index dc37b26d573..6f4b7c49217 100644 --- a/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php @@ -2,7 +2,6 @@ namespace Illuminate\Database\Schema\Grammars; -use Illuminate\Database\Connection; use Illuminate\Database\Query\Expression; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\IndexDefinition; @@ -30,14 +29,13 @@ class SQLiteGrammar extends Grammar /** * Get the commands to be compiled on the alter command. * - * @param \Illuminate\Database\Connection $connection * @return array */ - public function getAlterCommands(Connection $connection) + public function getAlterCommands() { $alterCommands = ['change', 'primary', 'dropPrimary', 'foreign', 'dropForeign']; - if (version_compare($connection->getServerVersion(), '3.35', '<')) { + if (version_compare($this->connection->getServerVersion(), '3.35', '<')) { $alterCommands[] = 'dropColumn'; } @@ -123,7 +121,7 @@ public function compileTables($schema, $withSize = false) /** * Compile the query for legacy versions of SQLite to determine the tables. * - * @param string|string[]|null $schema + * @param string $schema * @param bool $withSize * @return string */ @@ -321,12 +319,9 @@ public function compileAdd(Blueprint $blueprint, Fluent $command) * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection * @return array|string - * - * @throws \RuntimeException */ - public function compileAlter(Blueprint $blueprint, Fluent $command, Connection $connection) + public function compileAlter(Blueprint $blueprint, Fluent $command) { $columnNames = []; $autoIncrementColumn = null; @@ -354,12 +349,12 @@ public function compileAlter(Blueprint $blueprint, Fluent $command, Connection $ ->map(fn ($index) => $this->{'compile'.ucfirst($index->name)}($blueprint, $index)) ->all(); - [, $tableName] = $connection->getSchemaBuilder()->parseSchemaAndTable($blueprint->getTable()); - $tempTable = $this->wrapTable($blueprint, '__temp__'.$connection->getTablePrefix()); + [, $tableName] = $this->connection->getSchemaBuilder()->parseSchemaAndTable($blueprint->getTable()); + $tempTable = $this->wrapTable($blueprint, '__temp__'.$this->connection->getTablePrefix()); $table = $this->wrapTable($blueprint); $columnNames = implode(', ', $columnNames); - $foreignKeyConstraintsEnabled = $connection->scalar('pragma foreign_keys'); + $foreignKeyConstraintsEnabled = $this->connection->scalar('pragma foreign_keys'); return array_filter(array_merge([ $foreignKeyConstraintsEnabled ? $this->compileDisableForeignKeyConstraints() : null, @@ -380,12 +375,9 @@ public function compileAlter(Blueprint $blueprint, Fluent $command, Connection $ * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection * @return array|string - * - * @throws \RuntimeException */ - public function compileChange(Blueprint $blueprint, Fluent $command, Connection $connection) + public function compileChange(Blueprint $blueprint, Fluent $command) { // Handled on table alteration... } @@ -531,12 +523,11 @@ public function compileRebuild() * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection * @return array|null */ - public function compileDropColumn(Blueprint $blueprint, Fluent $command, Connection $connection) + public function compileDropColumn(Blueprint $blueprint, Fluent $command) { - if (version_compare($connection->getServerVersion(), '3.35', '<')) { + if (version_compare($this->connection->getServerVersion(), '3.35', '<')) { // Handled on table alteration... return null; @@ -639,14 +630,13 @@ public function compileRename(Blueprint $blueprint, Fluent $command) * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection * @return array * * @throws \RuntimeException */ - public function compileRenameIndex(Blueprint $blueprint, Fluent $command, Connection $connection) + public function compileRenameIndex(Blueprint $blueprint, Fluent $command) { - $indexes = $connection->getSchemaBuilder()->getIndexes($blueprint->getTable()); + $indexes = $this->connection->getSchemaBuilder()->getIndexes($blueprint->getTable()); $index = Arr::first($indexes, fn ($index) => $index['name'] === $command->from); diff --git a/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php b/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php index 6333b23e611..b387b3a4d42 100755 --- a/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php +++ b/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php @@ -2,7 +2,6 @@ namespace Illuminate\Database\Schema\Grammars; -use Illuminate\Database\Connection; use Illuminate\Database\Query\Expression; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Fluent; @@ -37,35 +36,6 @@ class SqlServerGrammar extends Grammar */ protected $fluentCommands = ['Default']; - /** - * Compile a create database command. - * - * @param string $name - * @param \Illuminate\Database\Connection $connection - * @return string - */ - public function compileCreateDatabase($name, $connection) - { - return sprintf( - 'create database %s', - $this->wrapValue($name), - ); - } - - /** - * Compile a drop database if exists command. - * - * @param string $name - * @return string - */ - public function compileDropDatabaseIfExists($name) - { - return sprintf( - 'drop database if exists %s', - $this->wrapValue($name) - ); - } - /** * Compile the query to determine the schemas. * @@ -261,10 +231,9 @@ public function compileAdd(Blueprint $blueprint, Fluent $command) * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection * @return array|string */ - public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Connection $connection) + public function compileRenameColumn(Blueprint $blueprint, Fluent $command) { return sprintf("sp_rename %s, %s, N'COLUMN'", $this->quoteString($this->wrapTable($blueprint).'.'.$this->wrap($command->from)), @@ -277,12 +246,9 @@ public function compileRenameColumn(Blueprint $blueprint, Fluent $command, Conne * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command - * @param \Illuminate\Database\Connection $connection * @return array|string - * - * @throws \RuntimeException */ - public function compileChange(Blueprint $blueprint, Fluent $command, Connection $connection) + public function compileChange(Blueprint $blueprint, Fluent $command) { return [ $this->compileDropDefaultConstraint($blueprint, $command), diff --git a/src/Illuminate/Database/Schema/MySqlBuilder.php b/src/Illuminate/Database/Schema/MySqlBuilder.php index b55f324b69e..6676411225e 100755 --- a/src/Illuminate/Database/Schema/MySqlBuilder.php +++ b/src/Illuminate/Database/Schema/MySqlBuilder.php @@ -4,32 +4,6 @@ class MySqlBuilder extends Builder { - /** - * Create a database in the schema. - * - * @param string $name - * @return bool - */ - public function createDatabase($name) - { - return $this->connection->statement( - $this->grammar->compileCreateDatabase($name, $this->connection) - ); - } - - /** - * Drop a database from the schema if the database exists. - * - * @param string $name - * @return bool - */ - public function dropDatabaseIfExists($name) - { - return $this->connection->statement( - $this->grammar->compileDropDatabaseIfExists($name) - ); - } - /** * Drop all tables from the database. * diff --git a/src/Illuminate/Database/Schema/PostgresBuilder.php b/src/Illuminate/Database/Schema/PostgresBuilder.php index f8b88d5b003..66f31174270 100755 --- a/src/Illuminate/Database/Schema/PostgresBuilder.php +++ b/src/Illuminate/Database/Schema/PostgresBuilder.php @@ -8,32 +8,6 @@ class PostgresBuilder extends Builder { use ParsesSearchPath; - /** - * Create a database in the schema. - * - * @param string $name - * @return bool - */ - public function createDatabase($name) - { - return $this->connection->statement( - $this->grammar->compileCreateDatabase($name, $this->connection) - ); - } - - /** - * Drop a database from the schema if the database exists. - * - * @param string $name - * @return bool - */ - public function dropDatabaseIfExists($name) - { - return $this->connection->statement( - $this->grammar->compileDropDatabaseIfExists($name) - ); - } - /** * Drop all tables from the database. * diff --git a/src/Illuminate/Database/Schema/SQLiteBuilder.php b/src/Illuminate/Database/Schema/SQLiteBuilder.php index af49bae8126..6e818c37db9 100644 --- a/src/Illuminate/Database/Schema/SQLiteBuilder.php +++ b/src/Illuminate/Database/Schema/SQLiteBuilder.php @@ -27,9 +27,7 @@ public function createDatabase($name) */ public function dropDatabaseIfExists($name) { - return File::exists($name) - ? File::delete($name) - : true; + return ! File::exists($name) || File::delete($name); } /** diff --git a/src/Illuminate/Database/Schema/SqlServerBuilder.php b/src/Illuminate/Database/Schema/SqlServerBuilder.php index 1cbc5afa769..9161bc61af7 100644 --- a/src/Illuminate/Database/Schema/SqlServerBuilder.php +++ b/src/Illuminate/Database/Schema/SqlServerBuilder.php @@ -6,32 +6,6 @@ class SqlServerBuilder extends Builder { - /** - * Create a database in the schema. - * - * @param string $name - * @return bool - */ - public function createDatabase($name) - { - return $this->connection->statement( - $this->grammar->compileCreateDatabase($name, $this->connection) - ); - } - - /** - * Drop a database from the schema if the database exists. - * - * @param string $name - * @return bool - */ - public function dropDatabaseIfExists($name) - { - return $this->connection->statement( - $this->grammar->compileDropDatabaseIfExists($name) - ); - } - /** * Drop all tables from the database. * diff --git a/src/Illuminate/Database/SqlServerConnection.php b/src/Illuminate/Database/SqlServerConnection.php index 19f7bb8afbf..1e6fe52bfe1 100755 --- a/src/Illuminate/Database/SqlServerConnection.php +++ b/src/Illuminate/Database/SqlServerConnection.php @@ -93,9 +93,7 @@ protected function isUniqueConstraintError(Exception $exception) */ protected function getDefaultQueryGrammar() { - ($grammar = new QueryGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); + return new QueryGrammar($this); } /** @@ -119,9 +117,7 @@ public function getSchemaBuilder() */ protected function getDefaultSchemaGrammar() { - ($grammar = new SchemaGrammar)->setConnection($this); - - return $this->withTablePrefix($grammar); + return new SchemaGrammar($this); } /** diff --git a/src/Illuminate/Support/Facades/DB.php b/src/Illuminate/Support/Facades/DB.php index 3e645ac530f..3ddeae76298 100644 --- a/src/Illuminate/Support/Facades/DB.php +++ b/src/Illuminate/Support/Facades/DB.php @@ -104,7 +104,6 @@ * @method static \Illuminate\Database\Connection setReadWriteType(string|null $readWriteType) * @method static string getTablePrefix() * @method static \Illuminate\Database\Connection setTablePrefix(string $prefix) - * @method static \Illuminate\Database\Grammar withTablePrefix(\Illuminate\Database\Grammar $grammar) * @method static mixed withoutTablePrefix(\Closure $callback) * @method static string getServerVersion() * @method static void resolverFor(string $driver, \Closure $callback) diff --git a/tests/Database/DatabaseAbstractSchemaGrammarTest.php b/tests/Database/DatabaseAbstractSchemaGrammarTest.php index 04e23eb264b..f7e4b3a7f80 100755 --- a/tests/Database/DatabaseAbstractSchemaGrammarTest.php +++ b/tests/Database/DatabaseAbstractSchemaGrammarTest.php @@ -17,21 +17,17 @@ protected function tearDown(): void public function testCreateDatabase() { - $grammar = new class extends Grammar {}; + $connection = m::mock(Connection::class); + $grammar = new class($connection) extends Grammar {}; - $this->expectException(LogicException::class); - $this->expectExceptionMessage('This database driver does not support creating databases.'); - - $grammar->compileCreateDatabase('foo', m::mock(Connection::class)); + $this->assertSame('create database "foo"', $grammar->compileCreateDatabase('foo')); } public function testDropDatabaseIfExists() { - $grammar = new class extends Grammar {}; - - $this->expectException(LogicException::class); - $this->expectExceptionMessage('This database driver does not support dropping databases.'); + $connection = m::mock(Connection::class); + $grammar = new class($connection) extends Grammar {}; - $grammar->compileDropDatabaseIfExists('foo'); + $this->assertSame('drop database if exists "foo"', $grammar->compileDropDatabaseIfExists('foo')); } } diff --git a/tests/Database/DatabaseEloquentBelongsToManyCreateOrFirstTest.php b/tests/Database/DatabaseEloquentBelongsToManyCreateOrFirstTest.php index 3ea77e45aed..8fb7dab3660 100644 --- a/tests/Database/DatabaseEloquentBelongsToManyCreateOrFirstTest.php +++ b/tests/Database/DatabaseEloquentBelongsToManyCreateOrFirstTest.php @@ -5,7 +5,7 @@ namespace Illuminate\Tests\Database; use Exception; -use Illuminate\Database\ConnectionInterface; +use Illuminate\Database\Connection; use Illuminate\Database\ConnectionResolverInterface; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; @@ -450,9 +450,11 @@ protected function mockConnectionForModels(array $models, string $database, arra { $grammarClass = 'Illuminate\Database\Query\Grammars\\'.$database.'Grammar'; $processorClass = 'Illuminate\Database\Query\Processors\\'.$database.'Processor'; - $grammar = new $grammarClass; $processor = new $processorClass; - $connection = Mockery::mock(ConnectionInterface::class, ['getQueryGrammar' => $grammar, 'getPostProcessor' => $processor]); + $connection = Mockery::mock(Connection::class, ['getPostProcessor' => $processor]); + $grammar = new $grammarClass($connection); + $connection->shouldReceive('getQueryGrammar')->andReturn($grammar); + $connection->shouldReceive('getTablePrefix')->andReturn(''); $connection->shouldReceive('query')->andReturnUsing(function () use ($connection, $grammar, $processor) { return new BaseBuilder($connection, $grammar, $processor); }); diff --git a/tests/Database/DatabaseEloquentBuilderCreateOrFirstTest.php b/tests/Database/DatabaseEloquentBuilderCreateOrFirstTest.php index b629194b6ea..63cffe311f5 100755 --- a/tests/Database/DatabaseEloquentBuilderCreateOrFirstTest.php +++ b/tests/Database/DatabaseEloquentBuilderCreateOrFirstTest.php @@ -3,7 +3,7 @@ namespace Illuminate\Tests\Database; use Exception; -use Illuminate\Database\ConnectionInterface; +use Illuminate\Database\Connection; use Illuminate\Database\ConnectionResolverInterface; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Query\Builder; @@ -473,9 +473,11 @@ protected function mockConnectionForModel(Model $model, string $database, array { $grammarClass = 'Illuminate\Database\Query\Grammars\\'.$database.'Grammar'; $processorClass = 'Illuminate\Database\Query\Processors\\'.$database.'Processor'; - $grammar = new $grammarClass; $processor = new $processorClass; - $connection = Mockery::mock(ConnectionInterface::class, ['getQueryGrammar' => $grammar, 'getPostProcessor' => $processor]); + $connection = Mockery::mock(Connection::class, ['getPostProcessor' => $processor]); + $grammar = new $grammarClass($connection); + $connection->shouldReceive('getQueryGrammar')->andReturn($grammar); + $connection->shouldReceive('getTablePrefix')->andReturn(''); $connection->shouldReceive('query')->andReturnUsing(function () use ($connection, $grammar, $processor) { return new Builder($connection, $grammar, $processor); }); diff --git a/tests/Database/DatabaseEloquentBuilderTest.php b/tests/Database/DatabaseEloquentBuilderTest.php index e7e65fac820..c0aac6061cf 100755 --- a/tests/Database/DatabaseEloquentBuilderTest.php +++ b/tests/Database/DatabaseEloquentBuilderTest.php @@ -4,6 +4,7 @@ use BadMethodCallException; use Closure; +use Illuminate\Database\Connection; use Illuminate\Database\ConnectionInterface; use Illuminate\Database\ConnectionResolverInterface; use Illuminate\Database\Eloquent\Builder; @@ -1000,11 +1001,6 @@ public function testQueryPassThru() $builder->getQuery()->shouldReceive('raw')->once()->with('bar')->andReturn('foo'); $this->assertSame('foo', $builder->raw('bar')); - - $builder = $this->getBuilder(); - $grammar = new Grammar; - $builder->getQuery()->shouldReceive('getGrammar')->once()->andReturn($grammar); - $this->assertSame($grammar, $builder->getGrammar()); } public function testQueryScopes() @@ -2320,7 +2316,9 @@ public function testUpdate() { Carbon::setTestNow($now = '2017-10-10 10:10:10'); - $query = new BaseBuilder(m::mock(ConnectionInterface::class), new Grammar, m::mock(Processor::class)); + $connection = m::mock(Connection::class); + $connection->shouldReceive('getTablePrefix')->andReturn(''); + $query = new BaseBuilder($connection, new Grammar($connection), m::mock(Processor::class)); $builder = new Builder($query); $model = new EloquentBuilderTestStub; $this->mockConnectionForModel($model, ''); @@ -2334,7 +2332,9 @@ public function testUpdate() public function testUpdateWithTimestampValue() { - $query = new BaseBuilder(m::mock(ConnectionInterface::class), new Grammar, m::mock(Processor::class)); + $connection = m::mock(Connection::class); + $connection->shouldReceive('getTablePrefix')->andReturn(''); + $query = new BaseBuilder($connection, new Grammar($connection), m::mock(Processor::class)); $builder = new Builder($query); $model = new EloquentBuilderTestStub; $this->mockConnectionForModel($model, ''); @@ -2348,7 +2348,9 @@ public function testUpdateWithTimestampValue() public function testUpdateWithQualifiedTimestampValue() { - $query = new BaseBuilder(m::mock(ConnectionInterface::class), new Grammar, m::mock(Processor::class)); + $connection = m::mock(Connection::class); + $connection->shouldReceive('getTablePrefix')->andReturn(''); + $query = new BaseBuilder($connection, new Grammar($connection), m::mock(Processor::class)); $builder = new Builder($query); $model = new EloquentBuilderTestStub; $this->mockConnectionForModel($model, ''); @@ -2362,7 +2364,9 @@ public function testUpdateWithQualifiedTimestampValue() public function testUpdateWithoutTimestamp() { - $query = new BaseBuilder(m::mock(ConnectionInterface::class), new Grammar, m::mock(Processor::class)); + $connection = m::mock(Connection::class); + $connection->shouldReceive('getTablePrefix')->andReturn(''); + $query = new BaseBuilder($connection, new Grammar($connection), m::mock(Processor::class)); $builder = new Builder($query); $model = new EloquentBuilderTestStubWithoutTimestamp; $this->mockConnectionForModel($model, ''); @@ -2378,7 +2382,9 @@ public function testUpdateWithAlias() { Carbon::setTestNow($now = '2017-10-10 10:10:10'); - $query = new BaseBuilder(m::mock(ConnectionInterface::class), new Grammar, m::mock(Processor::class)); + $connection = m::mock(Connection::class); + $connection->shouldReceive('getTablePrefix')->andReturn(''); + $query = new BaseBuilder($connection, new Grammar($connection), m::mock(Processor::class)); $builder = new Builder($query); $model = new EloquentBuilderTestStub; $this->mockConnectionForModel($model, ''); @@ -2394,7 +2400,9 @@ public function testUpdateWithAliasWithQualifiedTimestampValue() { Carbon::setTestNow($now = '2017-10-10 10:10:10'); - $query = new BaseBuilder(m::mock(ConnectionInterface::class), new Grammar, m::mock(Processor::class)); + $connection = m::mock(Connection::class); + $connection->shouldReceive('getTablePrefix')->andReturn(''); + $query = new BaseBuilder($connection, new Grammar($connection), m::mock(Processor::class)); $builder = new Builder($query); $model = new EloquentBuilderTestStub; $this->mockConnectionForModel($model, ''); @@ -2498,7 +2506,9 @@ public function testWithCastsMethod() public function testClone() { - $query = new BaseBuilder(m::mock(ConnectionInterface::class), new Grammar, m::mock(Processor::class)); + $connection = m::mock(Connection::class); + $connection->shouldReceive('getTablePrefix')->andReturn(''); + $query = new BaseBuilder($connection, new Grammar($connection), m::mock(Processor::class)); $builder = new Builder($query); $builder->select('*')->from('users'); $clone = $builder->clone()->where('email', 'foo'); @@ -2565,9 +2575,11 @@ protected function mockConnectionForModel($model, $database) { $grammarClass = 'Illuminate\Database\Query\Grammars\\'.$database.'Grammar'; $processorClass = 'Illuminate\Database\Query\Processors\\'.$database.'Processor'; - $grammar = new $grammarClass; $processor = new $processorClass; - $connection = m::mock(ConnectionInterface::class, ['getQueryGrammar' => $grammar, 'getPostProcessor' => $processor]); + $connection = m::mock(Connection::class, ['getPostProcessor' => $processor]); + $grammar = new $grammarClass($connection); + $connection->shouldReceive('getQueryGrammar')->andReturn($grammar); + $connection->shouldReceive('getTablePrefix')->andReturn(''); $connection->shouldReceive('query')->andReturnUsing(function () use ($connection, $grammar, $processor) { return new BaseBuilder($connection, $grammar, $processor); }); diff --git a/tests/Database/DatabaseEloquentHasManyCreateOrFirstTest.php b/tests/Database/DatabaseEloquentHasManyCreateOrFirstTest.php index 09faed3f265..5a3b9e5c1c0 100755 --- a/tests/Database/DatabaseEloquentHasManyCreateOrFirstTest.php +++ b/tests/Database/DatabaseEloquentHasManyCreateOrFirstTest.php @@ -3,7 +3,7 @@ namespace Illuminate\Tests\Database; use Exception; -use Illuminate\Database\ConnectionInterface; +use Illuminate\Database\Connection; use Illuminate\Database\ConnectionResolverInterface; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -320,9 +320,11 @@ protected function mockConnectionForModel(Model $model, string $database, array { $grammarClass = 'Illuminate\Database\Query\Grammars\\'.$database.'Grammar'; $processorClass = 'Illuminate\Database\Query\Processors\\'.$database.'Processor'; - $grammar = new $grammarClass; $processor = new $processorClass; - $connection = Mockery::mock(ConnectionInterface::class, ['getQueryGrammar' => $grammar, 'getPostProcessor' => $processor]); + $connection = Mockery::mock(Connection::class, ['getPostProcessor' => $processor]); + $grammar = new $grammarClass($connection); + $connection->shouldReceive('getQueryGrammar')->andReturn($grammar); + $connection->shouldReceive('getTablePrefix')->andReturn(''); $connection->shouldReceive('query')->andReturnUsing(function () use ($connection, $grammar, $processor) { return new Builder($connection, $grammar, $processor); }); diff --git a/tests/Database/DatabaseEloquentHasManyThroughCreateOrFirstTest.php b/tests/Database/DatabaseEloquentHasManyThroughCreateOrFirstTest.php index 1b364e57b9f..b499100ef40 100644 --- a/tests/Database/DatabaseEloquentHasManyThroughCreateOrFirstTest.php +++ b/tests/Database/DatabaseEloquentHasManyThroughCreateOrFirstTest.php @@ -5,7 +5,7 @@ namespace Illuminate\Tests\Database; use Exception; -use Illuminate\Database\ConnectionInterface; +use Illuminate\Database\Connection; use Illuminate\Database\ConnectionResolverInterface; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasManyThrough; @@ -372,9 +372,11 @@ protected function mockConnectionForModel(Model $model, string $database, array { $grammarClass = 'Illuminate\Database\Query\Grammars\\'.$database.'Grammar'; $processorClass = 'Illuminate\Database\Query\Processors\\'.$database.'Processor'; - $grammar = new $grammarClass; $processor = new $processorClass; - $connection = Mockery::mock(ConnectionInterface::class, ['getQueryGrammar' => $grammar, 'getPostProcessor' => $processor]); + $connection = Mockery::mock(Connection::class, ['getPostProcessor' => $processor]); + $grammar = new $grammarClass($connection); + $connection->shouldReceive('getQueryGrammar')->andReturn($grammar); + $connection->shouldReceive('getTablePrefix')->andReturn(''); $connection->shouldReceive('query')->andReturnUsing(function () use ($connection, $grammar, $processor) { return new Builder($connection, $grammar, $processor); }); diff --git a/tests/Database/DatabaseMariaDbBuilderTest.php b/tests/Database/DatabaseMariaDbBuilderTest.php index 9f26f35ed6a..35d26040786 100644 --- a/tests/Database/DatabaseMariaDbBuilderTest.php +++ b/tests/Database/DatabaseMariaDbBuilderTest.php @@ -1,6 +1,6 @@ shouldReceive('getConfig')->once()->with('charset')->andReturn('utf8mb4'); $connection->shouldReceive('getConfig')->once()->with('collation')->andReturn('utf8mb4_unicode_ci'); $connection->shouldReceive('getSchemaGrammar')->once()->andReturn($grammar); @@ -33,9 +33,9 @@ public function testCreateDatabase() public function testDropDatabaseIfExists() { - $grammar = new MariaDbGrammar; - $connection = m::mock(Connection::class); + $grammar = new MariaDbGrammar($connection); + $connection->shouldReceive('getSchemaGrammar')->once()->andReturn($grammar); $connection->shouldReceive('statement')->once()->with( 'drop database if exists `my_database_a`' diff --git a/tests/Database/DatabaseMariaDbQueryGrammarTest.php b/tests/Database/DatabaseMariaDbQueryGrammarTest.php index f5a5a4dc897..e86e5fd9193 100755 --- a/tests/Database/DatabaseMariaDbQueryGrammarTest.php +++ b/tests/Database/DatabaseMariaDbQueryGrammarTest.php @@ -18,8 +18,7 @@ public function testToRawSql() { $connection = m::mock(Connection::class); $connection->shouldReceive('escape')->with('foo', false)->andReturn("'foo'"); - $grammar = new MariaDbGrammar; - $grammar->setConnection($connection); + $grammar = new MariaDbGrammar($connection); $query = $grammar->substituteBindingsIntoRawSql( 'select * from "users" where \'Hello\\\'World?\' IS NOT NULL AND "email" = ?', diff --git a/tests/Database/DatabaseMariaDbSchemaGrammarTest.php b/tests/Database/DatabaseMariaDbSchemaGrammarTest.php index 53a573e33b8..e30063710c9 100755 --- a/tests/Database/DatabaseMariaDbSchemaGrammarTest.php +++ b/tests/Database/DatabaseMariaDbSchemaGrammarTest.php @@ -1,6 +1,6 @@ getGrammar(); - $grammar->setTablePrefix('prefix_'); - - $conn = $this->getConnection($grammar); + $conn = $this->getConnection(prefix: 'prefix_'); $conn->shouldReceive('getConfig')->andReturn(null); $blueprint = new Blueprint($conn, 'users'); @@ -1330,7 +1327,7 @@ public function testCreateDatabase() $connection->shouldReceive('getConfig')->once()->once()->with('charset')->andReturn('utf8mb4_foo'); $connection->shouldReceive('getConfig')->once()->once()->with('collation')->andReturn('utf8mb4_unicode_ci_foo'); - $statement = $this->getGrammar()->compileCreateDatabase('my_database_a', $connection); + $statement = $this->getGrammar($connection)->compileCreateDatabase('my_database_a'); $this->assertSame( 'create database `my_database_a` default character set `utf8mb4_foo` default collate `utf8mb4_unicode_ci_foo`', @@ -1341,7 +1338,7 @@ public function testCreateDatabase() $connection->shouldReceive('getConfig')->once()->once()->with('charset')->andReturn('utf8mb4_bar'); $connection->shouldReceive('getConfig')->once()->once()->with('collation')->andReturn('utf8mb4_unicode_ci_bar'); - $statement = $this->getGrammar()->compileCreateDatabase('my_database_b', $connection); + $statement = $this->getGrammar($connection)->compileCreateDatabase('my_database_b'); $this->assertSame( 'create database `my_database_b` default character set `utf8mb4_bar` default collate `utf8mb4_unicode_ci_bar`', @@ -1471,7 +1468,8 @@ public function testDropDatabaseIfExists() public function testDropAllTables() { - $statement = $this->getGrammar()->compileDropAllTables(['alpha', 'beta', 'gamma']); + $connection = $this->getConnection(); + $statement = $this->getGrammar($connection)->compileDropAllTables(['alpha', 'beta', 'gamma']); $this->assertSame('drop table `alpha`,`beta`,`gamma`', $statement); } @@ -1498,19 +1496,25 @@ public function testGrammarsAreMacroable() protected function getConnection( ?MariaDbGrammar $grammar = null, ?MariaDbBuilder $builder = null, + string $prefix = '' ) { - $grammar ??= $this->getGrammar(); + $connection = m::mock(Connection::class) + ->shouldReceive('getTablePrefix')->andReturn($prefix) + ->shouldReceive('getConfig')->with('prefix_indexes')->andReturn(null) + ->getMock(); + + $grammar ??= $this->getGrammar($connection); $builder ??= $this->getBuilder(); - return m::mock(Connection::class) + return $connection ->shouldReceive('getSchemaGrammar')->andReturn($grammar) ->shouldReceive('getSchemaBuilder')->andReturn($builder) ->getMock(); } - public function getGrammar() + public function getGrammar(?Connection $connection = null) { - return new MariaDbGrammar; + return new MariaDbGrammar($connection ?? $this->getConnection()); } public function getBuilder() diff --git a/tests/Database/DatabaseMySqlBuilderTest.php b/tests/Database/DatabaseMySqlBuilderTest.php index 464ce75c741..3317af8f2b7 100644 --- a/tests/Database/DatabaseMySqlBuilderTest.php +++ b/tests/Database/DatabaseMySqlBuilderTest.php @@ -17,9 +17,9 @@ protected function tearDown(): void public function testCreateDatabase() { - $grammar = new MySqlGrammar; - $connection = m::mock(Connection::class); + $grammar = new MySqlGrammar($connection); + $connection->shouldReceive('getConfig')->once()->with('charset')->andReturn('utf8mb4'); $connection->shouldReceive('getConfig')->once()->with('collation')->andReturn('utf8mb4_unicode_ci'); $connection->shouldReceive('getSchemaGrammar')->once()->andReturn($grammar); @@ -33,9 +33,9 @@ public function testCreateDatabase() public function testDropDatabaseIfExists() { - $grammar = new MySqlGrammar; - $connection = m::mock(Connection::class); + $grammar = new MySqlGrammar($connection); + $connection->shouldReceive('getSchemaGrammar')->once()->andReturn($grammar); $connection->shouldReceive('statement')->once()->with( 'drop database if exists `my_database_a`' diff --git a/tests/Database/DatabaseMySqlQueryGrammarTest.php b/tests/Database/DatabaseMySqlQueryGrammarTest.php index 2bb285415f7..04f5c1222e9 100755 --- a/tests/Database/DatabaseMySqlQueryGrammarTest.php +++ b/tests/Database/DatabaseMySqlQueryGrammarTest.php @@ -18,8 +18,7 @@ public function testToRawSql() { $connection = m::mock(Connection::class); $connection->shouldReceive('escape')->with('foo', false)->andReturn("'foo'"); - $grammar = new MySqlGrammar; - $grammar->setConnection($connection); + $grammar = new MySqlGrammar($connection); $query = $grammar->substituteBindingsIntoRawSql( 'select * from "users" where \'Hello\\\'World?\' IS NOT NULL AND "email" = ?', diff --git a/tests/Database/DatabaseMySqlSchemaGrammarTest.php b/tests/Database/DatabaseMySqlSchemaGrammarTest.php index 4615e419e20..64002304ba1 100755 --- a/tests/Database/DatabaseMySqlSchemaGrammarTest.php +++ b/tests/Database/DatabaseMySqlSchemaGrammarTest.php @@ -165,10 +165,7 @@ public function testCharsetCollationCreateTable() public function testBasicCreateTableWithPrefix() { - $grammar = $this->getGrammar(); - $grammar->setTablePrefix('prefix_'); - - $conn = $this->getConnection($grammar); + $conn = $this->getConnection(prefix: 'prefix_'); $conn->shouldReceive('getConfig')->andReturn(null); $blueprint = new Blueprint($conn, 'users'); @@ -1340,7 +1337,7 @@ public function testCreateDatabase() $connection->shouldReceive('getConfig')->once()->once()->with('charset')->andReturn('utf8mb4_foo'); $connection->shouldReceive('getConfig')->once()->once()->with('collation')->andReturn('utf8mb4_unicode_ci_foo'); - $statement = $this->getGrammar()->compileCreateDatabase('my_database_a', $connection); + $statement = $this->getGrammar($connection)->compileCreateDatabase('my_database_a'); $this->assertSame( 'create database `my_database_a` default character set `utf8mb4_foo` default collate `utf8mb4_unicode_ci_foo`', @@ -1351,7 +1348,7 @@ public function testCreateDatabase() $connection->shouldReceive('getConfig')->once()->once()->with('charset')->andReturn('utf8mb4_bar'); $connection->shouldReceive('getConfig')->once()->once()->with('collation')->andReturn('utf8mb4_unicode_ci_bar'); - $statement = $this->getGrammar()->compileCreateDatabase('my_database_b', $connection); + $statement = $this->getGrammar($connection)->compileCreateDatabase('my_database_b'); $this->assertSame( 'create database `my_database_b` default character set `utf8mb4_bar` default collate `utf8mb4_unicode_ci_bar`', @@ -1508,19 +1505,26 @@ public function testGrammarsAreMacroable() protected function getConnection( ?MySqlGrammar $grammar = null, ?MySqlBuilder $builder = null, + string $prefix = '' ) { - $grammar ??= $this->getGrammar(); + $connection = m::mock(Connection::class) + ->shouldReceive('getTablePrefix')->andReturn($prefix) + ->shouldReceive('getConfig')->with('prefix_indexes')->andReturn(null) + ->shouldReceive('isMaria')->andReturn(false) + ->getMock(); + + $grammar ??= $this->getGrammar($connection); $builder ??= $this->getBuilder(); - return m::mock(Connection::class) + return $connection ->shouldReceive('getSchemaGrammar')->andReturn($grammar) ->shouldReceive('getSchemaBuilder')->andReturn($builder) ->getMock(); } - public function getGrammar() + public function getGrammar(?Connection $connection = null) { - return new MySqlGrammar; + return new MySqlGrammar($connection ?? $this->getConnection()); } public function getBuilder() diff --git a/tests/Database/DatabasePostgresBuilderTest.php b/tests/Database/DatabasePostgresBuilderTest.php index ea6f77da62e..466817e48c5 100644 --- a/tests/Database/DatabasePostgresBuilderTest.php +++ b/tests/Database/DatabasePostgresBuilderTest.php @@ -18,9 +18,9 @@ protected function tearDown(): void public function testCreateDatabase() { - $grammar = new PostgresGrammar; - $connection = m::mock(Connection::class); + $grammar = new PostgresGrammar($connection); + $connection->shouldReceive('getConfig')->once()->with('charset')->andReturn('utf8'); $connection->shouldReceive('getSchemaGrammar')->once()->andReturn($grammar); $connection->shouldReceive('statement')->once()->with( @@ -33,9 +33,9 @@ public function testCreateDatabase() public function testDropDatabaseIfExists() { - $grammar = new PostgresGrammar; - $connection = m::mock(Connection::class); + $grammar = new PostgresGrammar($connection); + $connection->shouldReceive('getSchemaGrammar')->once()->andReturn($grammar); $connection->shouldReceive('statement')->once()->with( 'drop database if exists "my_database_a"' diff --git a/tests/Database/DatabasePostgresQueryGrammarTest.php b/tests/Database/DatabasePostgresQueryGrammarTest.php index 2fc526946ef..718ee9d9cd1 100755 --- a/tests/Database/DatabasePostgresQueryGrammarTest.php +++ b/tests/Database/DatabasePostgresQueryGrammarTest.php @@ -19,8 +19,7 @@ public function testToRawSql() { $connection = m::mock(Connection::class); $connection->shouldReceive('escape')->with('foo', false)->andReturn("'foo'"); - $grammar = new PostgresGrammar; - $grammar->setConnection($connection); + $grammar = new PostgresGrammar($connection); $query = $grammar->substituteBindingsIntoRawSql( 'select * from "users" where \'{}\' ?? \'Hello\\\'\\\'World?\' AND "email" = ?', @@ -36,8 +35,7 @@ public function testCustomOperators() PostgresGrammar::customOperators(['@@>', 1]); $connection = m::mock(Connection::class); - $grammar = new PostgresGrammar; - $grammar->setConnection($connection); + $grammar = new PostgresGrammar($connection); $operators = $grammar->getOperators(); @@ -51,7 +49,10 @@ public function testCustomOperators() public function testCompileTruncate() { - $postgres = new PostgresGrammar; + $connection = m::mock(Connection::class); + $connection->shouldReceive('getTablePrefix')->andReturn(''); + + $postgres = new PostgresGrammar($connection); $builder = m::mock(Builder::class); $builder->from = 'users'; diff --git a/tests/Database/DatabasePostgresSchemaGrammarTest.php b/tests/Database/DatabasePostgresSchemaGrammarTest.php index 041df2b2f04..c9cdd7ea524 100755 --- a/tests/Database/DatabasePostgresSchemaGrammarTest.php +++ b/tests/Database/DatabasePostgresSchemaGrammarTest.php @@ -57,7 +57,10 @@ public function testAddingVector() public function testCreateTableWithAutoIncrementStartingValue() { - $blueprint = new Blueprint($this->getConnection(), 'users'); + $connection = $this->getConnection(); + $connection->getSchemaBuilder()->shouldReceive('parseSchemaAndTable')->andReturn([null, 'users']); + + $blueprint = new Blueprint($connection, 'users'); $blueprint->create(); $blueprint->increments('id')->startingValue(1000); $blueprint->string('email'); @@ -71,7 +74,10 @@ public function testCreateTableWithAutoIncrementStartingValue() public function testAddColumnsWithMultipleAutoIncrementStartingValue() { - $blueprint = new Blueprint($this->getConnection(), 'users'); + $builder = $this->getBuilder(); + $builder->shouldReceive('parseSchemaAndTable')->andReturn([null, 'users']); + + $blueprint = new Blueprint($this->getConnection(builder: $builder), 'users'); $blueprint->id()->from(100); $blueprint->increments('code')->from(200); $blueprint->string('name')->from(300); @@ -158,7 +164,10 @@ public function testDropColumn() public function testDropPrimary() { - $blueprint = new Blueprint($this->getConnection(), 'users'); + $connection = $this->getConnection(); + $connection->getSchemaBuilder()->shouldReceive('parseSchemaAndTable')->andReturn([null, 'users']); + + $blueprint = new Blueprint($connection, 'users'); $blueprint->dropPrimary(); $statements = $blueprint->toSql(); @@ -1046,7 +1055,7 @@ public function testCreateDatabase() { $connection = $this->getConnection(); $connection->shouldReceive('getConfig')->once()->once()->with('charset')->andReturn('utf8_foo'); - $statement = $this->getGrammar()->compileCreateDatabase('my_database_a', $connection); + $statement = $this->getGrammar($connection)->compileCreateDatabase('my_database_a'); $this->assertSame( 'create database "my_database_a" encoding "utf8_foo"', @@ -1055,7 +1064,7 @@ public function testCreateDatabase() $connection = $this->getConnection(); $connection->shouldReceive('getConfig')->once()->once()->with('charset')->andReturn('utf8_bar'); - $statement = $this->getGrammar()->compileCreateDatabase('my_database_b', $connection); + $statement = $this->getGrammar($connection)->compileCreateDatabase('my_database_b'); $this->assertSame( 'create database "my_database_b" encoding "utf8_bar"', @@ -1104,12 +1113,9 @@ public function testDropAllTypesEscapesTableNames() public function testCompileColumns() { $connection = $this->getConnection(); - $grammar = $this->getGrammar(); - $connection->shouldReceive('getServerVersion')->once()->andReturn('12.0.0'); - $grammar->setConnection($connection); - $statement = $grammar->compileColumns('public', 'table'); + $statement = $connection->getSchemaGrammar()->compileColumns('public', 'table'); $this->assertStringContainsString("where c.relname = 'table' and n.nspname = 'public'", $statement); } @@ -1118,18 +1124,23 @@ protected function getConnection( ?PostgresGrammar $grammar = null, ?PostgresBuilder $builder = null ) { - $grammar ??= $this->getGrammar(); + $connection = m::mock(Connection::class) + ->shouldReceive('getTablePrefix')->andReturn('') + ->shouldReceive('getConfig')->with('prefix_indexes')->andReturn(null) + ->getMock(); + + $grammar ??= $this->getGrammar($connection); $builder ??= $this->getBuilder(); - return m::mock(Connection::class) + return $connection ->shouldReceive('getSchemaGrammar')->andReturn($grammar) ->shouldReceive('getSchemaBuilder')->andReturn($builder) ->getMock(); } - public function getGrammar() + public function getGrammar(?Connection $connection = null) { - return new PostgresGrammar; + return new PostgresGrammar($connection ?? $this->getConnection()); } public function getBuilder() diff --git a/tests/Database/DatabaseQueryBuilderTest.php b/tests/Database/DatabaseQueryBuilderTest.php index 94cfdfbe2fc..8e5df03ff74 100755 --- a/tests/Database/DatabaseQueryBuilderTest.php +++ b/tests/Database/DatabaseQueryBuilderTest.php @@ -6,7 +6,7 @@ use Closure; use DateTime; use Illuminate\Contracts\Database\Query\ConditionExpression; -use Illuminate\Database\ConnectionInterface; +use Illuminate\Database\Connection; use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\Expression as Raw; @@ -120,8 +120,7 @@ public function testAddingSelects() public function testBasicSelectWithPrefix() { - $builder = $this->getBuilder(); - $builder->getGrammar()->setTablePrefix('prefix_'); + $builder = $this->getBuilder(prefix: 'prefix_'); $builder->select('*')->from('users'); $this->assertSame('select * from "prefix_users"', $builder->toSql()); } @@ -153,16 +152,14 @@ public function testBasicAlias() public function testAliasWithPrefix() { - $builder = $this->getBuilder(); - $builder->getGrammar()->setTablePrefix('prefix_'); + $builder = $this->getBuilder(prefix: 'prefix_'); $builder->select('*')->from('users as people'); $this->assertSame('select * from "prefix_users" as "prefix_people"', $builder->toSql()); } public function testJoinAliasesWithPrefix() { - $builder = $this->getBuilder(); - $builder->getGrammar()->setTablePrefix('prefix_'); + $builder = $this->getBuilder(prefix: 'prefix_'); $builder->select('*')->from('services')->join('translations AS t', 't.item_id', '=', 'services.id'); $this->assertSame('select * from "prefix_services" inner join "prefix_translations" as "prefix_t" on "prefix_t"."item_id" = "prefix_services"."id"', $builder->toSql()); } @@ -3130,8 +3127,7 @@ public function testJoinSub() public function testJoinSubWithPrefix() { - $builder = $this->getBuilder(); - $builder->getGrammar()->setTablePrefix('prefix_'); + $builder = $this->getBuilder(prefix: 'prefix_'); $builder->from('users')->joinSub('select * from "contacts"', 'sub', 'users.id', '=', 'sub.id'); $this->assertSame('select * from "prefix_users" inner join (select * from "contacts") as "prefix_sub" on "prefix_users"."id" = "prefix_sub"."id"', $builder->toSql()); } @@ -3246,9 +3242,7 @@ public function testJoinLateralSqlServer() public function testJoinLateralWithPrefix() { - $builder = $this->getMySqlBuilder(); - $builder->getConnection()->shouldReceive('getDatabaseName'); - $builder->getGrammar()->setTablePrefix('prefix_'); + $builder = $this->getMySqlBuilder(prefix: 'prefix_'); $builder->from('users')->joinLateral('select * from `contacts` where `contracts`.`user_id` = `users`.`id`', 'sub'); $this->assertSame('select * from `prefix_users` inner join lateral (select * from `contacts` where `contracts`.`user_id` = `users`.`id`) as `prefix_sub` on true', $builder->toSql()); } @@ -4101,8 +4095,8 @@ public function testUpdateMethodWorksWithQueryAsValue() public function testUpdateOrInsertMethod() { $builder = m::mock(Builder::class.'[where,exists,insert]', [ - m::mock(ConnectionInterface::class), - new Grammar, + $connection = m::mock(Connection::class), + new Grammar($connection), m::mock(Processor::class), ]); @@ -4113,8 +4107,8 @@ public function testUpdateOrInsertMethod() $this->assertTrue($builder->updateOrInsert(['email' => 'foo'], ['name' => 'bar'])); $builder = m::mock(Builder::class.'[where,exists,update]', [ - m::mock(ConnectionInterface::class), - new Grammar, + $connection = m::mock(Connection::class), + new Grammar($connection), m::mock(Processor::class), ]); @@ -4129,8 +4123,8 @@ public function testUpdateOrInsertMethod() public function testUpdateOrInsertMethodWorksWithEmptyUpdateValues() { $builder = m::spy(Builder::class.'[where,exists,update]', [ - m::mock(ConnectionInterface::class), - new Grammar, + $connection = m::mock(Connection::class), + new Grammar($connection), m::mock(Processor::class), ]); @@ -4257,54 +4251,47 @@ public function testTruncateMethod() $builder = $this->getBuilder(); $connection = $builder->getConnection(); $connection->shouldReceive('statement')->once()->with('truncate table "users"', []); - $connection->shouldReceive('getSchemaBuilder->parseSchemaAndTable')->andReturn([null, 'users']); $builder->from('users')->truncate(); - $sqlite = (new SQLiteGrammar)->setConnection($connection); - $builder = $this->getBuilder(); + $builder = $this->getSQLiteBuilder(); + $builder->getConnection()->shouldReceive('getSchemaBuilder->parseSchemaAndTable')->andReturn([null, 'users']); $builder->from('users'); $this->assertEquals([ 'delete from sqlite_sequence where name = ?' => ['users'], 'delete from "users"' => [], - ], $sqlite->compileTruncate($builder)); + ], $builder->getGrammar()->compileTruncate($builder)); } public function testTruncateMethodWithPrefix() { - $builder = $this->getBuilder(); - $builder->getGrammar()->setTablePrefix('prefix_'); + $builder = $this->getBuilder(prefix: 'prefix_'); $connection = $builder->getConnection(); $connection->shouldReceive('statement')->once()->with('truncate table "prefix_users"', []); - $connection->shouldReceive('getSchemaBuilder->parseSchemaAndTable')->andReturn([null, 'users']); $builder->from('users')->truncate(); - $sqlite = (new SQLiteGrammar)->setConnection($connection); - $sqlite->setTablePrefix('prefix_'); - $builder = $this->getBuilder(); + $builder = $this->getSQLiteBuilder(prefix: 'prefix_'); + $builder->getConnection()->shouldReceive('getSchemaBuilder->parseSchemaAndTable')->andReturn([null, 'users']); $builder->from('users'); $this->assertEquals([ 'delete from sqlite_sequence where name = ?' => ['prefix_users'], 'delete from "prefix_users"' => [], - ], $sqlite->compileTruncate($builder)); + ], $builder->getGrammar()->compileTruncate($builder)); } public function testTruncateMethodWithPrefixAndSchema() { - $builder = $this->getBuilder(); - $builder->getGrammar()->setTablePrefix('prefix_'); + $builder = $this->getBuilder(prefix: 'prefix_'); $connection = $builder->getConnection(); $connection->shouldReceive('statement')->once()->with('truncate table "my_schema"."prefix_users"', []); - $connection->shouldReceive('getSchemaBuilder->parseSchemaAndTable')->andReturn(['my_schema', 'users']); $builder->from('my_schema.users')->truncate(); - $sqlite = (new SQLiteGrammar)->setConnection($connection); - $sqlite->setTablePrefix('prefix_'); - $builder = $this->getBuilder(); + $builder = $this->getSQLiteBuilder(prefix: 'prefix_'); + $builder->getConnection()->shouldReceive('getSchemaBuilder->parseSchemaAndTable')->andReturn(['my_schema', 'users']); $builder->from('my_schema.users'); $this->assertEquals([ 'delete from "my_schema".sqlite_sequence where name = ?' => ['prefix_users'], 'delete from "my_schema"."prefix_users"' => [], - ], $sqlite->compileTruncate($builder)); + ], $builder->getGrammar()->compileTruncate($builder)); } public function testPreserveAddsClosureToArray() @@ -4445,10 +4432,10 @@ public function testMySqlWrapping() public function testMySqlUpdateWrappingJson() { - $grammar = new MySqlGrammar; + $connection = $this->createMock(Connection::class); + $grammar = new MySqlGrammar($connection); $processor = m::mock(Processor::class); - $connection = $this->createMock(ConnectionInterface::class); $connection->expects($this->once()) ->method('update') ->with( @@ -4463,10 +4450,10 @@ public function testMySqlUpdateWrappingJson() public function testMySqlUpdateWrappingNestedJson() { - $grammar = new MySqlGrammar; + $connection = $this->createMock(Connection::class); + $grammar = new MySqlGrammar($connection); $processor = m::mock(Processor::class); - $connection = $this->createMock(ConnectionInterface::class); $connection->expects($this->once()) ->method('update') ->with( @@ -4481,10 +4468,10 @@ public function testMySqlUpdateWrappingNestedJson() public function testMySqlUpdateWrappingJsonArray() { - $grammar = new MySqlGrammar; + $connection = $this->createMock(Connection::class); + $grammar = new MySqlGrammar($connection); $processor = m::mock(Processor::class); - $connection = $this->createMock(ConnectionInterface::class); $connection->expects($this->once()) ->method('update') ->with( @@ -4508,10 +4495,10 @@ public function testMySqlUpdateWrappingJsonArray() public function testMySqlUpdateWrappingJsonPathArrayIndex() { - $grammar = new MySqlGrammar; + $connection = $this->createMock(Connection::class); + $grammar = new MySqlGrammar($connection); $processor = m::mock(Processor::class); - $connection = $this->createMock(ConnectionInterface::class); $connection->expects($this->once()) ->method('update') ->with( @@ -4531,10 +4518,10 @@ public function testMySqlUpdateWrappingJsonPathArrayIndex() public function testMySqlUpdateWithJsonPreparesBindingsCorrectly() { - $grammar = new MySqlGrammar; + $connection = $this->getConnection(); + $grammar = new MySqlGrammar($connection); $processor = m::mock(Processor::class); - $connection = m::mock(ConnectionInterface::class); $connection->shouldReceive('update') ->once() ->with( @@ -6686,8 +6673,7 @@ public function testFromSub() public function testFromSubWithPrefix() { - $builder = $this->getBuilder(); - $builder->getGrammar()->setTablePrefix('prefix_'); + $builder = $this->getBuilder(prefix: 'prefix_'); $builder->fromSub(function ($query) { $query->select(new Raw('max(last_seen_at) as last_seen_at'))->from('user_sessions')->where('foo', '=', '1'); }, 'sessions')->where('bar', '<', '10'); @@ -6844,11 +6830,11 @@ public function testCloneWithoutBindings() public function testToRawSql() { - $connection = m::mock(ConnectionInterface::class); + $connection = $this->getConnection(); $connection->shouldReceive('prepareBindings') ->with(['foo']) ->andReturn(['foo']); - $grammar = m::mock(Grammar::class)->makePartial(); + $grammar = m::mock(Grammar::class, [$connection])->makePartial(); $grammar->shouldReceive('substituteBindingsIntoRawSql') ->with('select * from "users" where "email" = ?', ['foo']) ->andReturn('select * from "users" where "email" = \'foo\''); @@ -6858,76 +6844,85 @@ public function testToRawSql() $this->assertSame('select * from "users" where "email" = \'foo\'', $builder->toRawSql()); } - protected function getConnection() + protected function getConnection(string $prefix = '') { - $connection = m::mock(ConnectionInterface::class); + $connection = m::mock(Connection::class); $connection->shouldReceive('getDatabaseName')->andReturn('database'); + $connection->shouldReceive('getTablePrefix')->andReturn($prefix); return $connection; } - protected function getBuilder() + protected function getBuilder(string $prefix = '') { - $grammar = new Grammar; + $connection = $this->getConnection(prefix: $prefix); + $grammar = new Grammar($connection); $processor = m::mock(Processor::class); - return new Builder($this->getConnection(), $grammar, $processor); + return new Builder($connection, $grammar, $processor); } - protected function getPostgresBuilder() + protected function getPostgresBuilder(string $prefix = '') { - $grammar = new PostgresGrammar; + $connection = $this->getConnection(prefix: $prefix); + $grammar = new PostgresGrammar($connection); $processor = m::mock(Processor::class); - return new Builder($this->getConnection(), $grammar, $processor); + return new Builder($connection, $grammar, $processor); } - protected function getMySqlBuilder() + protected function getMySqlBuilder(string $prefix = '') { - $grammar = new MySqlGrammar; + $connection = $this->getConnection(prefix: $prefix); + $grammar = new MySqlGrammar($connection); $processor = m::mock(Processor::class); - return new Builder(m::mock(ConnectionInterface::class), $grammar, $processor); + return new Builder($connection, $grammar, $processor); } - protected function getMariaDbBuilder() + protected function getMariaDbBuilder(string $prefix = '') { - $grammar = new MariaDbGrammar; + $connection = $this->getConnection(prefix: $prefix); + $grammar = new MariaDbGrammar($connection); $processor = m::mock(Processor::class); - return new Builder(m::mock(ConnectionInterface::class), $grammar, $processor); + return new Builder($connection, $grammar, $processor); } - protected function getSQLiteBuilder() + protected function getSQLiteBuilder(string $prefix = '') { - $grammar = new SQLiteGrammar; + $connection = $this->getConnection(prefix: $prefix); + $grammar = new SQLiteGrammar($connection); $processor = m::mock(Processor::class); - return new Builder(m::mock(ConnectionInterface::class), $grammar, $processor); + return new Builder($connection, $grammar, $processor); } - protected function getSqlServerBuilder() + protected function getSqlServerBuilder(string $prefix = '') { - $grammar = new SqlServerGrammar; + $connection = $this->getConnection(prefix: $prefix); + $grammar = new SqlServerGrammar($connection); $processor = m::mock(Processor::class); - return new Builder($this->getConnection(), $grammar, $processor); + return new Builder($connection, $grammar, $processor); } - protected function getMySqlBuilderWithProcessor() + protected function getMySqlBuilderWithProcessor(string $prefix = '') { - $grammar = new MySqlGrammar; + $connection = $this->getConnection(prefix: $prefix); + $grammar = new MySqlGrammar($connection); $processor = new MySqlProcessor; - return new Builder(m::mock(ConnectionInterface::class), $grammar, $processor); + return new Builder($connection, $grammar, $processor); } - protected function getPostgresBuilderWithProcessor() + protected function getPostgresBuilderWithProcessor(string $prefix = '') { - $grammar = new PostgresGrammar; + $connection = $this->getConnection(prefix: $prefix); + $grammar = new PostgresGrammar($connection); $processor = new PostgresProcessor; - return new Builder(m::mock(ConnectionInterface::class), $grammar, $processor); + return new Builder($connection, $grammar, $processor); } /** @@ -6936,8 +6931,8 @@ protected function getPostgresBuilderWithProcessor() protected function getMockQueryBuilder() { return m::mock(Builder::class, [ - m::mock(ConnectionInterface::class), - new Grammar, + $connection = $this->getConnection(), + new Grammar($connection), m::mock(Processor::class), ])->makePartial(); } diff --git a/tests/Database/DatabaseQueryGrammarTest.php b/tests/Database/DatabaseQueryGrammarTest.php index aee7f822cab..ced4930d3f9 100644 --- a/tests/Database/DatabaseQueryGrammarTest.php +++ b/tests/Database/DatabaseQueryGrammarTest.php @@ -2,6 +2,7 @@ namespace Illuminate\Tests\Database; +use Illuminate\Database\Connection; use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\Expression; use Illuminate\Database\Query\Grammars\Grammar; @@ -19,7 +20,7 @@ protected function tearDown(): void public function testWhereRawReturnsStringWhenExpressionPassed() { $builder = m::mock(Builder::class); - $grammar = new Grammar; + $grammar = new Grammar(m::mock(Connection::class)); $reflection = new ReflectionClass($grammar); $method = $reflection->getMethod('whereRaw'); $expressionArray = ['sql' => new Expression('select * from "users"')]; @@ -32,7 +33,7 @@ public function testWhereRawReturnsStringWhenExpressionPassed() public function testWhereRawReturnsStringWhenStringPassed() { $builder = m::mock(Builder::class); - $grammar = new Grammar; + $grammar = new Grammar(m::mock(Connection::class)); $reflection = new ReflectionClass($grammar); $method = $reflection->getMethod('whereRaw'); $stringArray = ['sql' => 'select * from "users"']; diff --git a/tests/Database/DatabaseSQLiteQueryGrammarTest.php b/tests/Database/DatabaseSQLiteQueryGrammarTest.php index 1cc5d77ed44..c9437735257 100755 --- a/tests/Database/DatabaseSQLiteQueryGrammarTest.php +++ b/tests/Database/DatabaseSQLiteQueryGrammarTest.php @@ -18,8 +18,7 @@ public function testToRawSql() { $connection = m::mock(Connection::class); $connection->shouldReceive('escape')->with('foo', false)->andReturn("'foo'"); - $grammar = new SQLiteGrammar; - $grammar->setConnection($connection); + $grammar = new SQLiteGrammar($connection); $query = $grammar->substituteBindingsIntoRawSql( 'select * from "users" where \'Hello\'\'World?\' IS NOT NULL AND "email" = ?', diff --git a/tests/Database/DatabaseSQLiteSchemaGrammarTest.php b/tests/Database/DatabaseSQLiteSchemaGrammarTest.php index 0b9c5dbbc34..f061c2a067a 100755 --- a/tests/Database/DatabaseSQLiteSchemaGrammarTest.php +++ b/tests/Database/DatabaseSQLiteSchemaGrammarTest.php @@ -1094,7 +1094,7 @@ protected function getConnection( public function getGrammar(?Connection $connection = null) { - return (new SQLiteGrammar())->setConnection($connection ?? $this->getConnection()); + return new SQLiteGrammar($connection ?? $this->getConnection()); } public function getBuilder() diff --git a/tests/Database/DatabaseSchemaBlueprintTest.php b/tests/Database/DatabaseSchemaBlueprintTest.php index d069d530dbc..e8546270597 100755 --- a/tests/Database/DatabaseSchemaBlueprintTest.php +++ b/tests/Database/DatabaseSchemaBlueprintTest.php @@ -6,17 +6,7 @@ use Illuminate\Database\Connection; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Builder; -use Illuminate\Database\Schema\Grammars\Grammar; -use Illuminate\Database\Schema\Grammars\MariaDbGrammar; use Illuminate\Database\Schema\Grammars\MySqlGrammar; -use Illuminate\Database\Schema\Grammars\PostgresGrammar; -use Illuminate\Database\Schema\Grammars\SQLiteGrammar; -use Illuminate\Database\Schema\Grammars\SqlServerGrammar; -use Illuminate\Database\Schema\MariaDbBuilder; -use Illuminate\Database\Schema\MySqlBuilder; -use Illuminate\Database\Schema\PostgresBuilder; -use Illuminate\Database\Schema\SQLiteBuilder; -use Illuminate\Database\Schema\SqlServerBuilder; use Illuminate\Tests\Database\Fixtures\Models\User; use Mockery as m; use PHPUnit\Framework\TestCase; @@ -120,10 +110,10 @@ public function testDefaultCurrentDateTime() })->toSql(); }; - $this->assertEquals(['alter table `users` add `created` datetime not null default CURRENT_TIMESTAMP'], $getSql(new MySqlGrammar)); - $this->assertEquals(['alter table "users" add column "created" timestamp(0) without time zone not null default CURRENT_TIMESTAMP'], $getSql(new PostgresGrammar)); - $this->assertEquals(['alter table "users" add column "created" datetime not null default CURRENT_TIMESTAMP'], $getSql(new SQLiteGrammar)); - $this->assertEquals(['alter table "users" add "created" datetime not null default CURRENT_TIMESTAMP'], $getSql(new SqlServerGrammar)); + $this->assertEquals(['alter table `users` add `created` datetime not null default CURRENT_TIMESTAMP'], $getSql('MySql')); + $this->assertEquals(['alter table "users" add column "created" timestamp(0) without time zone not null default CURRENT_TIMESTAMP'], $getSql('Postgres')); + $this->assertEquals(['alter table "users" add column "created" datetime not null default CURRENT_TIMESTAMP'], $getSql('SQLite')); + $this->assertEquals(['alter table "users" add "created" datetime not null default CURRENT_TIMESTAMP'], $getSql('SqlServer')); } public function testDefaultCurrentTimestamp() @@ -134,10 +124,10 @@ public function testDefaultCurrentTimestamp() })->toSql(); }; - $this->assertEquals(['alter table `users` add `created` timestamp not null default CURRENT_TIMESTAMP'], $getSql(new MySqlGrammar)); - $this->assertEquals(['alter table "users" add column "created" timestamp(0) without time zone not null default CURRENT_TIMESTAMP'], $getSql(new PostgresGrammar)); - $this->assertEquals(['alter table "users" add column "created" datetime not null default CURRENT_TIMESTAMP'], $getSql(new SQLiteGrammar)); - $this->assertEquals(['alter table "users" add "created" datetime not null default CURRENT_TIMESTAMP'], $getSql(new SqlServerGrammar)); + $this->assertEquals(['alter table `users` add `created` timestamp not null default CURRENT_TIMESTAMP'], $getSql('MySql')); + $this->assertEquals(['alter table "users" add column "created" timestamp(0) without time zone not null default CURRENT_TIMESTAMP'], $getSql('Postgres')); + $this->assertEquals(['alter table "users" add column "created" datetime not null default CURRENT_TIMESTAMP'], $getSql('SQLite')); + $this->assertEquals(['alter table "users" add "created" datetime not null default CURRENT_TIMESTAMP'], $getSql('SqlServer')); } public function testRemoveColumn() @@ -150,7 +140,7 @@ public function testRemoveColumn() })->toSql(); }; - $this->assertEquals(['alter table `users` add `foo` varchar(255) not null'], $getSql(new MySqlGrammar)); + $this->assertEquals(['alter table `users` add `foo` varchar(255) not null'], $getSql('MySql')); } public function testRenameColumn() @@ -165,15 +155,15 @@ public function testRenameColumn() }))->toSql(); }; - $this->assertEquals(['alter table `users` rename column `foo` to `bar`'], $getSql(new MySqlGrammar)); - $this->assertEquals(['alter table "users" rename column "foo" to "bar"'], $getSql(new PostgresGrammar)); - $this->assertEquals(['alter table "users" rename column "foo" to "bar"'], $getSql(new SQLiteGrammar)); - $this->assertEquals(['sp_rename N\'"users"."foo"\', "bar", N\'COLUMN\''], $getSql(new SqlServerGrammar)); + $this->assertEquals(['alter table `users` rename column `foo` to `bar`'], $getSql('MySql')); + $this->assertEquals(['alter table "users" rename column "foo" to "bar"'], $getSql('Postgres')); + $this->assertEquals(['alter table "users" rename column "foo" to "bar"'], $getSql('SQLite')); + $this->assertEquals(['sp_rename N\'"users"."foo"\', "bar", N\'COLUMN\''], $getSql('SqlServer')); } public function testNativeRenameColumnOnMysql57() { - $connection = $this->getConnection(new MySqlGrammar); + $connection = $this->getConnection('MySql'); $connection->shouldReceive('isMaria')->andReturn(false); $connection->shouldReceive('getServerVersion')->andReturn('5.7'); $connection->getSchemaBuilder()->shouldReceive('getColumns')->andReturn([ @@ -197,7 +187,7 @@ public function testNativeRenameColumnOnMysql57() public function testNativeRenameColumnOnLegacyMariaDB() { - $connection = $this->getConnection(new MariaDbGrammar); + $connection = $this->getConnection('MariaDb'); $connection->shouldReceive('isMaria')->andReturn(true); $connection->shouldReceive('getServerVersion')->andReturn('10.1.35'); $connection->getSchemaBuilder()->shouldReceive('getColumns')->andReturn([ @@ -230,15 +220,15 @@ public function testDropColumn() })->toSql(); }; - $this->assertEquals(['alter table `users` drop `foo`'], $getSql(new MySqlGrammar)); - $this->assertEquals(['alter table "users" drop column "foo"'], $getSql(new PostgresGrammar)); - $this->assertEquals(['alter table "users" drop column "foo"'], $getSql(new SQLiteGrammar)); - $this->assertStringContainsString('alter table "users" drop column "foo"', $getSql(new SqlServerGrammar)[0]); + $this->assertEquals(['alter table `users` drop `foo`'], $getSql('MySql')); + $this->assertEquals(['alter table "users" drop column "foo"'], $getSql('Postgres')); + $this->assertEquals(['alter table "users" drop column "foo"'], $getSql('SQLite')); + $this->assertStringContainsString('alter table "users" drop column "foo"', $getSql('SqlServer')[0]); } public function testNativeColumnModifyingOnMySql() { - $blueprint = $this->getBlueprint(new MySqlGrammar, 'users', function ($table) { + $blueprint = $this->getBlueprint('MySql', 'users', function ($table) { $table->double('amount')->nullable()->invisible()->after('name')->change(); $table->timestamp('added_at', 4)->nullable(false)->useCurrent()->useCurrentOnUpdate()->change(); $table->enum('difficulty', ['easy', 'hard'])->default('easy')->charset('utf8mb4')->collation('unicode')->change(); @@ -268,7 +258,7 @@ public function testMacroable() return 'bar'; }); - $blueprint = $this->getBlueprint(new MySqlGrammar, 'users', function ($table) { + $blueprint = $this->getBlueprint('MySql', 'users', function ($table) { $table->foo(); }); @@ -287,7 +277,7 @@ public function testDefaultUsingIdMorph() 'alter table `comments` add `commentable_type` varchar(255) not null', 'alter table `comments` add `commentable_id` bigint unsigned not null', 'alter table `comments` add index `comments_commentable_type_commentable_id_index`(`commentable_type`, `commentable_id`)', - ], $getSql(new MySqlGrammar)); + ], $getSql('MySql')); } public function testDefaultUsingNullableIdMorph() @@ -302,7 +292,7 @@ public function testDefaultUsingNullableIdMorph() 'alter table `comments` add `commentable_type` varchar(255) null', 'alter table `comments` add `commentable_id` bigint unsigned null', 'alter table `comments` add index `comments_commentable_type_commentable_id_index`(`commentable_type`, `commentable_id`)', - ], $getSql(new MySqlGrammar)); + ], $getSql('MySql')); } public function testDefaultUsingUuidMorph() @@ -319,7 +309,7 @@ public function testDefaultUsingUuidMorph() 'alter table `comments` add `commentable_type` varchar(255) not null', 'alter table `comments` add `commentable_id` char(36) not null', 'alter table `comments` add index `comments_commentable_type_commentable_id_index`(`commentable_type`, `commentable_id`)', - ], $getSql(new MySqlGrammar)); + ], $getSql('MySql')); } public function testDefaultUsingNullableUuidMorph() @@ -336,7 +326,7 @@ public function testDefaultUsingNullableUuidMorph() 'alter table `comments` add `commentable_type` varchar(255) null', 'alter table `comments` add `commentable_id` char(36) null', 'alter table `comments` add index `comments_commentable_type_commentable_id_index`(`commentable_type`, `commentable_id`)', - ], $getSql(new MySqlGrammar)); + ], $getSql('MySql')); } public function testDefaultUsingUlidMorph() @@ -353,7 +343,7 @@ public function testDefaultUsingUlidMorph() 'alter table `comments` add `commentable_type` varchar(255) not null', 'alter table `comments` add `commentable_id` char(26) not null', 'alter table `comments` add index `comments_commentable_type_commentable_id_index`(`commentable_type`, `commentable_id`)', - ], $getSql(new MySqlGrammar)); + ], $getSql('MySql')); } public function testDefaultUsingNullableUlidMorph() @@ -370,7 +360,7 @@ public function testDefaultUsingNullableUlidMorph() 'alter table `comments` add `commentable_type` varchar(255) null', 'alter table `comments` add `commentable_id` char(26) null', 'alter table `comments` add index `comments_commentable_type_commentable_id_index`(`commentable_type`, `commentable_id`)', - ], $getSql(new MySqlGrammar)); + ], $getSql('MySql')); } public function testGenerateRelationshipColumnWithIncrementalModel() @@ -383,7 +373,7 @@ public function testGenerateRelationshipColumnWithIncrementalModel() $this->assertEquals([ 'alter table `posts` add `user_id` bigint unsigned not null', - ], $getSql(new MySqlGrammar)); + ], $getSql('MySql')); } public function testGenerateRelationshipColumnWithNonIncrementalModel() @@ -396,7 +386,7 @@ public function testGenerateRelationshipColumnWithNonIncrementalModel() $this->assertEquals([ 'alter table `posts` add `model_using_non_incremented_int_id` bigint unsigned not null', - ], $getSql(new MySqlGrammar)); + ], $getSql('MySql')); } public function testGenerateRelationshipColumnWithUuidModel() @@ -409,7 +399,7 @@ public function testGenerateRelationshipColumnWithUuidModel() $this->assertEquals([ 'alter table `posts` add `model_using_uuid_id` char(36) not null', - ], $getSql(new MySqlGrammar)); + ], $getSql('MySql')); } public function testGenerateRelationshipColumnWithUlidModel() @@ -422,11 +412,11 @@ public function testGenerateRelationshipColumnWithUlidModel() $this->assertEquals([ 'alter table "posts" add column "model_using_ulid_id" char(26) not null', - ], $getSql(new PostgresGrammar)); + ], $getSql('Postgres')); $this->assertEquals([ 'alter table `posts` add `model_using_ulid_id` char(26) not null', - ], $getSql(new MySqlGrammar)); + ], $getSql('MySql')); } public function testGenerateRelationshipConstrainedColumn() @@ -440,7 +430,7 @@ public function testGenerateRelationshipConstrainedColumn() $this->assertEquals([ 'alter table `posts` add `user_id` bigint unsigned not null', 'alter table `posts` add constraint `posts_user_id_foreign` foreign key (`user_id`) references `users` (`id`)', - ], $getSql(new MySqlGrammar)); + ], $getSql('MySql')); } public function testGenerateRelationshipForModelWithNonStandardPrimaryKeyName() @@ -454,7 +444,7 @@ public function testGenerateRelationshipForModelWithNonStandardPrimaryKeyName() $this->assertEquals([ 'alter table `posts` add `user_internal_id` bigint unsigned not null', 'alter table `posts` add constraint `posts_user_internal_id_foreign` foreign key (`user_internal_id`) references `users` (`internal_id`)', - ], $getSql(new MySqlGrammar)); + ], $getSql('MySql')); } public function testDropRelationshipColumnWithIncrementalModel() @@ -467,7 +457,7 @@ public function testDropRelationshipColumnWithIncrementalModel() $this->assertEquals([ 'alter table `posts` drop `user_id`', - ], $getSql(new MySqlGrammar)); + ], $getSql('MySql')); } public function testDropRelationshipColumnWithUuidModel() @@ -480,7 +470,7 @@ public function testDropRelationshipColumnWithUuidModel() $this->assertEquals([ 'alter table `posts` drop `model_using_uuid_id`', - ], $getSql(new MySqlGrammar)); + ], $getSql('MySql')); } public function testDropConstrainedRelationshipColumnWithIncrementalModel() @@ -494,7 +484,7 @@ public function testDropConstrainedRelationshipColumnWithIncrementalModel() $this->assertEquals([ 'alter table `posts` drop foreign key `posts_user_id_foreign`', 'alter table `posts` drop `user_id`', - ], $getSql(new MySqlGrammar)); + ], $getSql('MySql')); } public function testDropConstrainedRelationshipColumnWithUuidModel() @@ -508,7 +498,7 @@ public function testDropConstrainedRelationshipColumnWithUuidModel() $this->assertEquals([ 'alter table `posts` drop foreign key `posts_model_using_uuid_id_foreign`', 'alter table `posts` drop `model_using_uuid_id`', - ], $getSql(new MySqlGrammar)); + ], $getSql('MySql')); } public function testTinyTextColumn() @@ -519,10 +509,10 @@ public function testTinyTextColumn() })->toSql(); }; - $this->assertEquals(['alter table `posts` add `note` tinytext not null'], $getSql(new MySqlGrammar)); - $this->assertEquals(['alter table "posts" add column "note" text not null'], $getSql(new SQLiteGrammar)); - $this->assertEquals(['alter table "posts" add column "note" varchar(255) not null'], $getSql(new PostgresGrammar)); - $this->assertEquals(['alter table "posts" add "note" nvarchar(255) not null'], $getSql(new SqlServerGrammar)); + $this->assertEquals(['alter table `posts` add `note` tinytext not null'], $getSql('MySql')); + $this->assertEquals(['alter table "posts" add column "note" text not null'], $getSql('SQLite')); + $this->assertEquals(['alter table "posts" add column "note" varchar(255) not null'], $getSql('Postgres')); + $this->assertEquals(['alter table "posts" add "note" nvarchar(255) not null'], $getSql('SqlServer')); } public function testTinyTextNullableColumn() @@ -533,10 +523,10 @@ public function testTinyTextNullableColumn() })->toSql(); }; - $this->assertEquals(['alter table `posts` add `note` tinytext null'], $getSql(new MySqlGrammar)); - $this->assertEquals(['alter table "posts" add column "note" text'], $getSql(new SQLiteGrammar)); - $this->assertEquals(['alter table "posts" add column "note" varchar(255) null'], $getSql(new PostgresGrammar)); - $this->assertEquals(['alter table "posts" add "note" nvarchar(255) null'], $getSql(new SqlServerGrammar)); + $this->assertEquals(['alter table `posts` add `note` tinytext null'], $getSql('MySql')); + $this->assertEquals(['alter table "posts" add column "note" text'], $getSql('SQLite')); + $this->assertEquals(['alter table "posts" add column "note" varchar(255) null'], $getSql('Postgres')); + $this->assertEquals(['alter table "posts" add "note" nvarchar(255) null'], $getSql('SqlServer')); } public function testRawColumn() @@ -549,19 +539,19 @@ public function testRawColumn() $this->assertEquals([ 'alter table `posts` add `legacy_boolean` INT(1) null', - ], $getSql(new MySqlGrammar)); + ], $getSql('MySql')); $this->assertEquals([ 'alter table "posts" add column "legacy_boolean" INT(1)', - ], $getSql(new SQLiteGrammar)); + ], $getSql('SQLite')); $this->assertEquals([ 'alter table "posts" add column "legacy_boolean" INT(1) null', - ], $getSql(new PostgresGrammar)); + ], $getSql('Postgres')); $this->assertEquals([ 'alter table "posts" add "legacy_boolean" INT(1) null', - ], $getSql(new SqlServerGrammar)); + ], $getSql('SqlServer')); } public function testTableComment() @@ -572,42 +562,43 @@ public function testTableComment() })->toSql(); }; - $this->assertEquals(['alter table `posts` comment = \'Look at my comment, it is amazing\''], $getSql(new MySqlGrammar)); - $this->assertEquals(['comment on table "posts" is \'Look at my comment, it is amazing\''], $getSql(new PostgresGrammar)); + $this->assertEquals(['alter table `posts` comment = \'Look at my comment, it is amazing\''], $getSql('MySql')); + $this->assertEquals(['comment on table "posts" is \'Look at my comment, it is amazing\''], $getSql('Postgres')); } - protected function getConnection(?Grammar $grammar = null) + protected function getConnection(?string $grammar = null, string $prefix = '') { - $grammar ??= new MySqlGrammar; + $connection = m::mock(Connection::class) + ->shouldReceive('getTablePrefix')->andReturn($prefix) + ->shouldReceive('getConfig')->with('prefix_indexes')->andReturn(true) + ->getMock(); - $builder = mock(match ($grammar::class) { - MySqlGrammar::class => MySqlBuilder::class, - PostgresGrammar::class => PostgresBuilder::class, - SQLiteGrammar::class => SQLiteBuilder::class, - SqlServerGrammar::class => SqlServerBuilder::class, - MariaDbGrammar::class => MariaDbBuilder::class, - default => Builder::class, - }); + $grammar ??= 'MySql'; + $grammarClass = 'Illuminate\Database\Schema\Grammars\\'.$grammar.'Grammar'; + $builderClass = 'Illuminate\Database\Schema\\'.$grammar.'Builder'; - $connection = m::mock(Connection::class) - ->shouldReceive('getSchemaGrammar')->andReturn($grammar) - ->shouldReceive('getSchemaBuilder')->andReturn($builder); + $connection->shouldReceive('getSchemaGrammar')->andReturn(new $grammarClass($connection)); + $connection->shouldReceive('getSchemaBuilder')->andReturn(m::mock($builderClass)); - if ($grammar instanceof SQLiteGrammar) { + if ($grammar === 'SQLite') { $connection->shouldReceive('getServerVersion')->andReturn('3.35'); } - return $connection->getMock(); + if ($grammar === 'MySql') { + $connection->shouldReceive('isMaria')->andReturn(false); + } + + return $connection; } protected function getBlueprint( - ?Grammar $grammar = null, + ?string $grammar = null, string $table = '', ?Closure $callback = null, string $prefix = '' ): Blueprint { - $connection = $this->getConnection($grammar); + $connection = $this->getConnection($grammar, $prefix); - return new Blueprint($connection, $table, $callback, $prefix); + return new Blueprint($connection, $table, $callback); } } diff --git a/tests/Database/DatabaseSchemaBuilderTest.php b/tests/Database/DatabaseSchemaBuilderTest.php index e2f03e36dcc..7cf84cfa87c 100644 --- a/tests/Database/DatabaseSchemaBuilderTest.php +++ b/tests/Database/DatabaseSchemaBuilderTest.php @@ -22,26 +22,24 @@ public function testCreateDatabase() { $connection = m::mock(Connection::class); $grammar = m::mock(stdClass::class); + $grammar->shouldReceive('compileCreateDatabase')->andReturn('sql'); $connection->shouldReceive('getSchemaGrammar')->andReturn($grammar); + $connection->shouldReceive('statement')->with('sql')->andReturnTrue(); $builder = new Builder($connection); - $this->expectException(LogicException::class); - $this->expectExceptionMessage('This database driver does not support creating databases.'); - - $builder->createDatabase('foo'); + $this->assertTrue($builder->createDatabase('foo')); } public function testDropDatabaseIfExists() { $connection = m::mock(Connection::class); $grammar = m::mock(stdClass::class); + $grammar->shouldReceive('compileDropDatabaseIfExists')->andReturn('sql'); $connection->shouldReceive('getSchemaGrammar')->andReturn($grammar); + $connection->shouldReceive('statement')->with('sql')->andReturnTrue(); $builder = new Builder($connection); - $this->expectException(LogicException::class); - $this->expectExceptionMessage('This database driver does not support dropping databases.'); - - $builder->dropDatabaseIfExists('foo'); + $this->assertTrue($builder->dropDatabaseIfExists('foo')); } public function testHasTableCorrectlyCallsGrammar() diff --git a/tests/Database/DatabaseSqlServerQueryGrammarTest.php b/tests/Database/DatabaseSqlServerQueryGrammarTest.php index 2960719672e..f3052b1250b 100755 --- a/tests/Database/DatabaseSqlServerQueryGrammarTest.php +++ b/tests/Database/DatabaseSqlServerQueryGrammarTest.php @@ -18,8 +18,7 @@ public function testToRawSql() { $connection = m::mock(Connection::class); $connection->shouldReceive('escape')->with('foo', false)->andReturn("'foo'"); - $grammar = new SqlServerGrammar; - $grammar->setConnection($connection); + $grammar = new SqlServerGrammar($connection); $query = $grammar->substituteBindingsIntoRawSql( "select * from [users] where 'Hello''World?' IS NOT NULL AND [email] = ?", diff --git a/tests/Database/DatabaseSqlServerSchemaGrammarTest.php b/tests/Database/DatabaseSqlServerSchemaGrammarTest.php index 8877e450770..d0600347349 100755 --- a/tests/Database/DatabaseSqlServerSchemaGrammarTest.php +++ b/tests/Database/DatabaseSqlServerSchemaGrammarTest.php @@ -40,7 +40,7 @@ public function testBasicCreateTable() 'alter table "users" add "email" nvarchar(255) not null', ], $statements); - $conn = $this->getConnection($this->getGrammar()->setTablePrefix('prefix_')); + $conn = $this->getConnection(prefix: 'prefix_'); $blueprint = new Blueprint($conn, 'users'); $blueprint->create(); $blueprint->increments('id'); @@ -68,8 +68,7 @@ public function testCreateTemporaryTable() public function testCreateTemporaryTableWithPrefix() { - $connection = $this->getConnection(); - $connection->shouldReceive('getTablePrefix')->andReturn('prefix_'); + $connection = $this->getConnection(prefix: 'prefix_'); $blueprint = new Blueprint($connection, 'users'); $blueprint->create(); $blueprint->temporary(); @@ -90,7 +89,7 @@ public function testDropTable() $this->assertCount(1, $statements); $this->assertSame('drop table "users"', $statements[0]); - $conn = $this->getConnection($this->getGrammar()->setTablePrefix('prefix_')); + $conn = $this->getConnection(prefix: 'prefix_'); $blueprint = new Blueprint($conn, 'users'); $blueprint->drop(); $statements = $blueprint->toSql(); @@ -108,7 +107,7 @@ public function testDropTableIfExists() $this->assertCount(1, $statements); $this->assertSame('if object_id(N\'"users"\', \'U\') is not null drop table "users"', $statements[0]); - $conn = $this->getConnection($this->getGrammar()->setTablePrefix('prefix_')); + $conn = $this->getConnection(prefix: 'prefix_'); $blueprint = new Blueprint($conn, 'users'); $blueprint->dropIfExists(); $statements = $blueprint->toSql(); @@ -932,16 +931,14 @@ public function testQuoteStringOnArray() public function testCreateDatabase() { - $connection = $this->getConnection(); - - $statement = $this->getGrammar()->compileCreateDatabase('my_database_a', $connection); + $statement = $this->getGrammar()->compileCreateDatabase('my_database_a'); $this->assertSame( 'create database "my_database_a"', $statement ); - $statement = $this->getGrammar()->compileCreateDatabase('my_database_b', $connection); + $statement = $this->getGrammar()->compileCreateDatabase('my_database_b'); $this->assertSame( 'create database "my_database_b"', @@ -968,9 +965,14 @@ public function testDropDatabaseIfExists() protected function getConnection( ?SqlServerGrammar $grammar = null, - ?SqlServerBuilder $builder = null + ?SqlServerBuilder $builder = null, + string $prefix = '' ) { - $connection = m::mock(Connection::class); + $connection = m::mock(Connection::class) + ->shouldReceive('getTablePrefix')->andReturn($prefix) + ->shouldReceive('getConfig')->with('prefix_indexes')->andReturn(null) + ->getMock(); + $grammar ??= $this->getGrammar($connection); $builder ??= $this->getBuilder(); @@ -982,8 +984,7 @@ protected function getConnection( public function getGrammar(?Connection $connection = null) { - return ($grammar = new SqlServerGrammar) - ->setConnection($connection ?? $this->getConnection(grammar: $grammar)); + return new SqlServerGrammar($connection ?? $this->getConnection()); } public function getBuilder() diff --git a/tests/Database/SqlServerBuilderTest.php b/tests/Database/SqlServerBuilderTest.php index 039cadb8394..5ae3689adfd 100644 --- a/tests/Database/SqlServerBuilderTest.php +++ b/tests/Database/SqlServerBuilderTest.php @@ -17,9 +17,9 @@ protected function tearDown(): void public function testCreateDatabase() { - $grammar = new SqlServerGrammar; - $connection = m::mock(Connection::class); + $grammar = new SqlServerGrammar($connection); + $connection->shouldReceive('getSchemaGrammar')->once()->andReturn($grammar); $connection->shouldReceive('statement')->once()->with( 'create database "my_temporary_database_a"' @@ -31,9 +31,9 @@ public function testCreateDatabase() public function testDropDatabaseIfExists() { - $grammar = new SqlServerGrammar; - $connection = m::mock(Connection::class); + $grammar = new SqlServerGrammar($connection); + $connection->shouldReceive('getSchemaGrammar')->once()->andReturn($grammar); $connection->shouldReceive('statement')->once()->with( 'drop database if exists "my_temporary_database_b"' diff --git a/tests/Integration/Database/Sqlite/DatabaseSchemaBlueprintTest.php b/tests/Integration/Database/Sqlite/DatabaseSchemaBlueprintTest.php index 2db84efd5aa..cf1e7171231 100644 --- a/tests/Integration/Database/Sqlite/DatabaseSchemaBlueprintTest.php +++ b/tests/Integration/Database/Sqlite/DatabaseSchemaBlueprintTest.php @@ -4,11 +4,6 @@ use Closure; use Illuminate\Database\Schema\Blueprint; -use Illuminate\Database\Schema\Grammars\Grammar; -use Illuminate\Database\Schema\Grammars\MySqlGrammar; -use Illuminate\Database\Schema\Grammars\PostgresGrammar; -use Illuminate\Database\Schema\Grammars\SQLiteGrammar; -use Illuminate\Database\Schema\Grammars\SqlServerGrammar; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; use Orchestra\Testbench\Attributes\RequiresDatabase; @@ -37,7 +32,7 @@ public function testRenamingAndChangingColumnsWork() $table->string('age'); }); - $blueprint = $this->getBlueprint(new SQLiteGrammar, 'users', function ($table) { + $blueprint = $this->getBlueprint('SQLite', 'users', function ($table) { $table->renameColumn('name', 'first_name'); $table->integer('age')->change(); }); @@ -76,7 +71,7 @@ public function testRenamingColumnsWorks() public function testNativeColumnModifyingOnPostgreSql() { - $blueprint = $this->getBlueprint(new PostgresGrammar, 'users', function ($table) { + $blueprint = $this->getBlueprint('Postgres', 'users', function ($table) { $table->integer('code')->autoIncrement()->from(10)->comment('my comment')->change(); }); @@ -88,7 +83,7 @@ public function testNativeColumnModifyingOnPostgreSql() 'comment on column "users"."code" is \'my comment\'', ], $blueprint->toSql()); - $blueprint = $this->getBlueprint(new PostgresGrammar, 'users', function ($table) { + $blueprint = $this->getBlueprint('Postgres', 'users', function ($table) { $table->char('name', 40)->nullable()->default('easy')->collation('unicode')->change(); }); @@ -101,7 +96,7 @@ public function testNativeColumnModifyingOnPostgreSql() 'comment on column "users"."name" is NULL', ], $blueprint->toSql()); - $blueprint = $this->getBlueprint(new PostgresGrammar, 'users', function ($table) { + $blueprint = $this->getBlueprint('Postgres', 'users', function ($table) { $table->integer('foo')->generatedAs('expression')->always()->change(); }); @@ -115,7 +110,7 @@ public function testNativeColumnModifyingOnPostgreSql() 'comment on column "users"."foo" is NULL', ], $blueprint->toSql()); - $blueprint = $this->getBlueprint(new PostgresGrammar, 'users', function ($table) { + $blueprint = $this->getBlueprint('Postgres', 'users', function ($table) { $table->geometry('foo', 'point', 1234)->change(); }); @@ -128,7 +123,7 @@ public function testNativeColumnModifyingOnPostgreSql() 'comment on column "users"."foo" is NULL', ], $blueprint->toSql()); - $blueprint = $this->getBlueprint(new PostgresGrammar, 'users', function ($table) { + $blueprint = $this->getBlueprint('Postgres', 'users', function ($table) { $table->timestamp('added_at', 2)->useCurrent()->storedAs(null)->change(); }); @@ -145,7 +140,7 @@ public function testNativeColumnModifyingOnPostgreSql() public function testNativeColumnModifyingOnSqlServer() { - $blueprint = $this->getBlueprint(new SqlServerGrammar, 'users', function ($table) { + $blueprint = $this->getBlueprint('SqlServer', 'users', function ($table) { $table->timestamp('added_at', 4)->nullable(false)->useCurrent()->change(); }); @@ -155,7 +150,7 @@ public function testNativeColumnModifyingOnSqlServer() 'alter table "users" add default CURRENT_TIMESTAMP for "added_at"', ], $blueprint->toSql()); - $blueprint = $this->getBlueprint(new SqlServerGrammar, 'users', function ($table) { + $blueprint = $this->getBlueprint('SqlServer', 'users', function ($table) { $table->char('name', 40)->nullable()->default('easy')->collation('unicode')->change(); }); @@ -165,7 +160,7 @@ public function testNativeColumnModifyingOnSqlServer() 'alter table "users" add default \'easy\' for "name"', ], $blueprint->toSql()); - $blueprint = $this->getBlueprint(new SqlServerGrammar, 'users', function ($table) { + $blueprint = $this->getBlueprint('SqlServer', 'users', function ($table) { $table->integer('foo')->change(); }); @@ -181,11 +176,11 @@ public function testChangingColumnWithCollationWorks() $table->string('age'); }); - $blueprint = $this->getBlueprint(new SQLiteGrammar, 'users', function ($table) { + $blueprint = $this->getBlueprint('SQLite', 'users', function ($table) { $table->integer('age')->collation('RTRIM')->change(); }); - $blueprint2 = $this->getBlueprint(new SQLiteGrammar, 'users', function ($table) { + $blueprint2 = $this->getBlueprint('SQLite', 'users', function ($table) { $table->integer('age')->collation('NOCASE')->change(); }); @@ -231,7 +226,7 @@ public function testChangingCharColumnsWork() 'alter table "__temp__users" rename to "users"', ]; - $this->assertEquals($expected, $getSql(new SQLiteGrammar)); + $this->assertEquals($expected, $getSql('SQLite')); } public function testChangingPrimaryAutoincrementColumnsToNonAutoincrementColumnsWork() @@ -253,7 +248,7 @@ public function testChangingPrimaryAutoincrementColumnsToNonAutoincrementColumns 'alter table "__temp__users" rename to "users"', ]; - $this->assertEquals($expected, $getSql(new SQLiteGrammar)); + $this->assertEquals($expected, $getSql('SQLite')); } public function testChangingDoubleColumnsWork() @@ -275,7 +270,7 @@ public function testChangingDoubleColumnsWork() 'alter table "__temp__products" rename to "products"', ]; - $this->assertEquals($expected, $getSql(new SQLiteGrammar)); + $this->assertEquals($expected, $getSql('SQLite')); } public function testChangingColumnsWithDefaultWorks() @@ -300,7 +295,7 @@ public function testChangingColumnsWithDefaultWorks() 'alter table "__temp__products" rename to "products"', ]; - $this->assertEquals($expected, $getSql(new SQLiteGrammar)); + $this->assertEquals($expected, $getSql('SQLite')); } public function testRenameIndexWorks() @@ -324,25 +319,25 @@ public function testRenameIndexWorks() 'create index "index2" on "users" ("name")', ]; - $this->assertEquals($expected, $getSql(new SQLiteGrammar)); + $this->assertEquals($expected, $getSql('SQLite')); $expected = [ 'sp_rename N\'"users"."index1"\', "index2", N\'INDEX\'', ]; - $this->assertEquals($expected, $getSql(new SqlServerGrammar)); + $this->assertEquals($expected, $getSql('SqlServer')); $expected = [ 'alter table `users` rename index `index1` to `index2`', ]; - $this->assertEquals($expected, $getSql(new MySqlGrammar)); + $this->assertEquals($expected, $getSql('MySql')); $expected = [ 'alter index "index1" rename to "index2"', ]; - $this->assertEquals($expected, $getSql(new PostgresGrammar)); + $this->assertEquals($expected, $getSql('Postgres')); } public function testAddUniqueIndexWithoutNameWorks() @@ -362,7 +357,7 @@ public function testAddUniqueIndexWithoutNameWorks() 'alter table `users` add unique `users_name_unique`(`name`)', ]; - $this->assertEquals($expected, $getSql(new MySqlGrammar)); + $this->assertEquals($expected, $getSql('MySql')); $expected = [ 'alter table "users" alter column "name" type varchar(255), alter column "name" drop not null, alter column "name" drop default, alter column "name" drop identity if exists', @@ -370,7 +365,7 @@ public function testAddUniqueIndexWithoutNameWorks() 'comment on column "users"."name" is NULL', ]; - $this->assertEquals($expected, $getSql(new PostgresGrammar)); + $this->assertEquals($expected, $getSql('Postgres')); $expected = [ 'create table "__temp__users" ("name" varchar)', @@ -380,7 +375,7 @@ public function testAddUniqueIndexWithoutNameWorks() 'create unique index "users_name_unique" on "users" ("name")', ]; - $this->assertEquals($expected, $getSql(new SQLiteGrammar)); + $this->assertEquals($expected, $getSql('SQLite')); $expected = [ "DECLARE @sql NVARCHAR(MAX) = '';SELECT @sql += 'ALTER TABLE \"users\" DROP CONSTRAINT ' + OBJECT_NAME([default_object_id]) + ';' FROM sys.columns WHERE [object_id] = OBJECT_ID(N'\"users\"') AND [name] in ('name') AND [default_object_id] <> 0;EXEC(@sql)", @@ -388,7 +383,7 @@ public function testAddUniqueIndexWithoutNameWorks() 'create unique index "users_name_unique" on "users" ("name")', ]; - $this->assertEquals($expected, $getSql(new SqlServerGrammar)); + $this->assertEquals($expected, $getSql('SqlServer')); } public function testAddUniqueIndexWithNameWorks() @@ -408,7 +403,7 @@ public function testAddUniqueIndexWithNameWorks() 'alter table `users` add unique `index1`(`name`)', ]; - $this->assertEquals($expected, $getSql(new MySqlGrammar)); + $this->assertEquals($expected, $getSql('MySql')); $expected = [ 'alter table "users" alter column "name" type integer, alter column "name" drop not null, alter column "name" drop default, alter column "name" drop identity if exists', @@ -416,7 +411,7 @@ public function testAddUniqueIndexWithNameWorks() 'comment on column "users"."name" is NULL', ]; - $this->assertEquals($expected, $getSql(new PostgresGrammar)); + $this->assertEquals($expected, $getSql('Postgres')); $expected = [ 'create table "__temp__users" ("name" integer)', @@ -426,7 +421,7 @@ public function testAddUniqueIndexWithNameWorks() 'create unique index "index1" on "users" ("name")', ]; - $this->assertEquals($expected, $getSql(new SQLiteGrammar)); + $this->assertEquals($expected, $getSql('SQLite')); $expected = [ "DECLARE @sql NVARCHAR(MAX) = '';SELECT @sql += 'ALTER TABLE \"users\" DROP CONSTRAINT ' + OBJECT_NAME([default_object_id]) + ';' FROM sys.columns WHERE [object_id] = OBJECT_ID(N'\"users\"') AND [name] in ('name') AND [default_object_id] <> 0;EXEC(@sql)", @@ -434,7 +429,7 @@ public function testAddUniqueIndexWithNameWorks() 'create unique index "index1" on "users" ("name")', ]; - $this->assertEquals($expected, $getSql(new SqlServerGrammar)); + $this->assertEquals($expected, $getSql('SqlServer')); } public function testAddColumnNamedCreateWorks() @@ -464,22 +459,22 @@ public function testDropIndexOnColumnChangeWorks() $this->assertContains( 'alter table `users` drop index `users_name_unique`', - $getSql(new MySqlGrammar), + $getSql('MySql'), ); $this->assertContains( 'alter table "users" drop constraint "users_name_unique"', - $getSql(new PostgresGrammar), + $getSql('Postgres'), ); $this->assertContains( 'drop index "users_name_unique"', - $getSql(new SQLiteGrammar), + $getSql('SQLite'), ); $this->assertContains( 'drop index "users_name_unique" on "users"', - $getSql(new SqlServerGrammar), + $getSql('SqlServer'), ); } @@ -515,12 +510,14 @@ public function testItEnsuresDroppingForeignKeyIsAvailable() } protected function getBlueprint( - Grammar $grammar, + string $grammar, string $table, Closure $callback, ): Blueprint { - $connection = DB::connection()->setSchemaGrammar($grammar); - $grammar->setConnection($connection); + $grammarClass = 'Illuminate\Database\Schema\Grammars\\'.$grammar.'Grammar'; + + $connection = DB::connection(); + $connection->setSchemaGrammar(new $grammarClass($connection)); return new Blueprint($connection, $table, $callback); } From 9ac7659017cb8bdc8dbb3b1f36c4dfd0f9160d24 Mon Sep 17 00:00:00 2001 From: Hafez Divandari Date: Thu, 6 Feb 2025 06:21:22 +0330 Subject: [PATCH 2/4] formatting --- .../DatabaseAbstractSchemaGrammarTest.php | 1 - .../DatabasePostgresSchemaGrammarTest.php | 2 +- tests/Database/DatabaseSchemaBuilderTest.php | 1 - .../Concerns/InteractsWithDatabaseTest.php | 21 ++++++++----------- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/tests/Database/DatabaseAbstractSchemaGrammarTest.php b/tests/Database/DatabaseAbstractSchemaGrammarTest.php index f7e4b3a7f80..3eeee6beb22 100755 --- a/tests/Database/DatabaseAbstractSchemaGrammarTest.php +++ b/tests/Database/DatabaseAbstractSchemaGrammarTest.php @@ -4,7 +4,6 @@ use Illuminate\Database\Connection; use Illuminate\Database\Schema\Grammars\Grammar; -use LogicException; use Mockery as m; use PHPUnit\Framework\TestCase; diff --git a/tests/Database/DatabasePostgresSchemaGrammarTest.php b/tests/Database/DatabasePostgresSchemaGrammarTest.php index c9cdd7ea524..3b7b0cb4e9c 100755 --- a/tests/Database/DatabasePostgresSchemaGrammarTest.php +++ b/tests/Database/DatabasePostgresSchemaGrammarTest.php @@ -1115,7 +1115,7 @@ public function testCompileColumns() $connection = $this->getConnection(); $connection->shouldReceive('getServerVersion')->once()->andReturn('12.0.0'); - $statement = $connection->getSchemaGrammar()->compileColumns('public', 'table'); + $statement = $connection->getSchemaGrammar()->compileColumns('public', 'table'); $this->assertStringContainsString("where c.relname = 'table' and n.nspname = 'public'", $statement); } diff --git a/tests/Database/DatabaseSchemaBuilderTest.php b/tests/Database/DatabaseSchemaBuilderTest.php index 7cf84cfa87c..c069c5f5e77 100644 --- a/tests/Database/DatabaseSchemaBuilderTest.php +++ b/tests/Database/DatabaseSchemaBuilderTest.php @@ -6,7 +6,6 @@ use Illuminate\Database\Query\Processors\Processor; use Illuminate\Database\Schema\Builder; use Illuminate\Database\Schema\Grammars\Grammar; -use LogicException; use Mockery as m; use PHPUnit\Framework\TestCase; use stdClass; diff --git a/tests/Testing/Concerns/InteractsWithDatabaseTest.php b/tests/Testing/Concerns/InteractsWithDatabaseTest.php index 9b9168930c6..eb6b7cd4265 100644 --- a/tests/Testing/Concerns/InteractsWithDatabaseTest.php +++ b/tests/Testing/Concerns/InteractsWithDatabaseTest.php @@ -2,13 +2,8 @@ namespace Illuminate\Tests\Testing\Concerns; -use Illuminate\Database\ConnectionInterface; +use Illuminate\Database\Connection; use Illuminate\Database\Query\Expression; -use Illuminate\Database\Query\Grammars\MariaDbGrammar; -use Illuminate\Database\Query\Grammars\MySqlGrammar; -use Illuminate\Database\Query\Grammars\PostgresGrammar; -use Illuminate\Database\Query\Grammars\SQLiteGrammar; -use Illuminate\Database\Query\Grammars\SqlServerGrammar; use Illuminate\Foundation\Testing\Concerns\InteractsWithDatabase; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Facade; @@ -30,7 +25,7 @@ protected function tearDown(): void public function testCastToJsonSqlite() { - $grammar = new SQLiteGrammar(); + $grammar = 'SQLite'; $this->assertEquals(<<<'TEXT' '["foo","bar"]' @@ -53,7 +48,7 @@ public function testCastToJsonSqlite() public function testCastToJsonPostgres() { - $grammar = new PostgresGrammar(); + $grammar = 'Postgres'; $this->assertEquals(<<<'TEXT' '["foo","bar"]' @@ -76,7 +71,7 @@ public function testCastToJsonPostgres() public function testCastToJsonSqlServer() { - $grammar = new SqlServerGrammar(); + $grammar = 'SqlServer'; $this->assertEquals(<<<'TEXT' json_query('["foo","bar"]') @@ -99,7 +94,7 @@ public function testCastToJsonSqlServer() public function testCastToJsonMySql() { - $grammar = new MySqlGrammar(); + $grammar = 'MySql'; $this->assertEquals(<<<'TEXT' cast('["foo","bar"]' as json) @@ -122,7 +117,7 @@ public function testCastToJsonMySql() public function testCastToJsonMariaDb() { - $grammar = new MariaDbGrammar(); + $grammar = 'MariaDb'; $this->assertEquals(<<<'TEXT' json_query('["foo","bar"]', '$') @@ -145,7 +140,9 @@ public function testCastToJsonMariaDb() protected function castAsJson($value, $grammar) { - $connection = m::mock(ConnectionInterface::class); + $connection = m::mock(Connection::class); + $grammarClass = 'Illuminate\Database\Query\Grammars\\'.$grammar.'Grammar'; + $grammar = new $grammarClass($connection); $connection->shouldReceive('getQueryGrammar')->andReturn($grammar); From 8eeec5173f4576e84cc0e03dabebbf7f34abf3bb Mon Sep 17 00:00:00 2001 From: Hafez Divandari Date: Thu, 6 Feb 2025 15:43:48 +0330 Subject: [PATCH 3/4] formatting --- src/Illuminate/Database/Grammar.php | 4 ++-- src/Illuminate/Database/Schema/Blueprint.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Illuminate/Database/Grammar.php b/src/Illuminate/Database/Grammar.php index 33ed9fbc6f3..595a7af22ea 100755 --- a/src/Illuminate/Database/Grammar.php +++ b/src/Illuminate/Database/Grammar.php @@ -287,7 +287,7 @@ public function getDateFormat() /** * Get the grammar's table prefix. * - * @deprected Use DB::getTablePrefix() + * @deprecated Use DB::getTablePrefix() * * @return string */ @@ -299,7 +299,7 @@ public function getTablePrefix() /** * Set the grammar's table prefix. * - * @deprected DB::setTablePrefix() + * @deprecated DB::setTablePrefix() * * @param string $prefix * @return $this diff --git a/src/Illuminate/Database/Schema/Blueprint.php b/src/Illuminate/Database/Schema/Blueprint.php index 5be9ff05b19..f21962dd952 100755 --- a/src/Illuminate/Database/Schema/Blueprint.php +++ b/src/Illuminate/Database/Schema/Blueprint.php @@ -1819,7 +1819,7 @@ public function getTable() /** * Get the table prefix. * - * @deprected Use DB::getTablePrefix() + * @deprecated Use DB::getTablePrefix() * * @return string */ From 71454367daacc2a8f5e8498fdb0fb35ca2dc08d1 Mon Sep 17 00:00:00 2001 From: Hafez Divandari Date: Thu, 6 Feb 2025 15:45:53 +0330 Subject: [PATCH 4/4] formatting --- src/Illuminate/Database/Grammar.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Grammar.php b/src/Illuminate/Database/Grammar.php index 595a7af22ea..4ff5ddc34a1 100755 --- a/src/Illuminate/Database/Grammar.php +++ b/src/Illuminate/Database/Grammar.php @@ -299,7 +299,7 @@ public function getTablePrefix() /** * Set the grammar's table prefix. * - * @deprecated DB::setTablePrefix() + * @deprecated Use DB::setTablePrefix() * * @param string $prefix * @return $this