diff --git a/framework/core/migrations/2024_05_05_000001_convert_preferences_to_json_in_users.php b/framework/core/migrations/2024_05_05_000001_convert_preferences_to_json_in_users.php index 6079b0e9de..5181c8558c 100644 --- a/framework/core/migrations/2024_05_05_000001_convert_preferences_to_json_in_users.php +++ b/framework/core/migrations/2024_05_05_000001_convert_preferences_to_json_in_users.php @@ -7,24 +7,32 @@ * LICENSE file that was distributed with this source code. */ +use Illuminate\Database\MariaDbConnection; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Builder; return [ 'up' => function (Builder $schema) { - $preferences = $schema->getConnection()->getSchemaGrammar()->wrap('preferences'); + $connection = $schema->getConnection(); + $driver = $connection->getDriverName(); - if ($schema->getConnection()->getDriverName() === 'pgsql') { - $users = $schema->getConnection()->getSchemaGrammar()->wrapTable('users'); - $schema->getConnection()->statement("ALTER TABLE $users ALTER COLUMN $preferences TYPE JSON USING $preferences::TEXT::JSON"); + $preferences = $connection->getSchemaGrammar()->wrap('preferences'); + + if ($driver === 'pgsql') { + $users = $connection->getSchemaGrammar()->wrapTable('users'); + $connection->statement("ALTER TABLE $users ALTER COLUMN $preferences TYPE JSON USING $preferences::TEXT::JSON"); } else { $schema->table('users', function (Blueprint $table) { $table->json('preferences_json')->nullable(); }); - if ($schema->getConnection()->getDriverName() === 'mysql') { - $schema->getConnection()->table('users')->update([ - 'preferences_json' => $schema->getConnection()->raw("CAST(CONVERT($preferences USING utf8mb4) AS JSON)"), + if ($connection instanceof MariaDbConnection) { + $connection->table('users')->update([ + 'preferences_json' => $connection->raw("IF(JSON_VALID(CONVERT($preferences USING utf8mb4)), CONVERT($preferences USING utf8mb4), NULL)"), + ]); + } elseif ($driver === 'mysql') { + $connection->table('users')->update([ + 'preferences_json' => $connection->raw("CAST(CONVERT($preferences USING utf8mb4) AS JSON)"), ]); } @@ -39,19 +47,22 @@ }, 'down' => function (Builder $schema) { - $preferences = $schema->getConnection()->getSchemaGrammar()->wrap('preferences'); + $connection = $schema->getConnection(); + $driver = $connection->getDriverName(); + + $preferences = $connection->getSchemaGrammar()->wrap('preferences'); - if ($schema->getConnection()->getDriverName() === 'pgsql') { - $users = $schema->getConnection()->getSchemaGrammar()->wrapTable('users'); - $schema->getConnection()->statement("ALTER TABLE $users ALTER COLUMN $preferences TYPE BYTEA USING preferences::TEXT::BYTEA"); + if ($driver === 'pgsql') { + $users = $connection->getSchemaGrammar()->wrapTable('users'); + $connection->statement("ALTER TABLE $users ALTER COLUMN $preferences TYPE BYTEA USING preferences::TEXT::BYTEA"); } else { $schema->table('users', function (Blueprint $table) { $table->binary('preferences_binary')->nullable(); }); - if ($schema->getConnection()->getDriverName() === 'mysql') { - $schema->getConnection()->table('users')->update([ - 'preferences_binary' => $schema->getConnection()->raw($preferences), + if ($driver === 'mysql') { + $connection->table('users')->update([ + 'preferences_binary' => $connection->raw($preferences), ]); } diff --git a/framework/core/migrations/2024_05_07_000001_convert_data_to_json_in_notifications.php b/framework/core/migrations/2024_05_07_000001_convert_data_to_json_in_notifications.php index 82ca9e76e8..3ecc2842ab 100644 --- a/framework/core/migrations/2024_05_07_000001_convert_data_to_json_in_notifications.php +++ b/framework/core/migrations/2024_05_07_000001_convert_data_to_json_in_notifications.php @@ -7,23 +7,31 @@ * LICENSE file that was distributed with this source code. */ +use Illuminate\Database\MariaDbConnection; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Builder; return [ 'up' => function (Builder $schema) { - if ($schema->getConnection()->getDriverName() === 'pgsql') { - $notifications = $schema->getConnection()->getSchemaGrammar()->wrapTable('notifications'); - $data = $schema->getConnection()->getSchemaGrammar()->wrap('data'); - $schema->getConnection()->statement("ALTER TABLE $notifications ALTER COLUMN $data TYPE JSON USING data::TEXT::JSON"); + $connection = $schema->getConnection(); + $driver = $connection->getDriverName(); + + if ($driver === 'pgsql') { + $notifications = $connection->getSchemaGrammar()->wrapTable('notifications'); + $data = $connection->getSchemaGrammar()->wrap('data'); + $connection->statement("ALTER TABLE $notifications ALTER COLUMN $data TYPE JSON USING data::TEXT::JSON"); } else { $schema->table('notifications', function (Blueprint $table) { $table->json('data_json')->nullable(); }); - if ($schema->getConnection()->getDriverName() === 'mysql') { - $schema->getConnection()->table('notifications')->update([ - 'data_json' => $schema->getConnection()->raw('CAST(CONVERT(data USING utf8mb4) AS JSON)'), + if ($connection instanceof MariaDbConnection) { + $connection->table('notifications')->update([ + 'data_json' => $connection->raw('IF(JSON_VALID(CONVERT(data USING utf8mb4)), CONVERT(data USING utf8mb4), NULL)'), + ]); + } elseif ($driver === 'mysql') { + $connection->table('notifications')->update([ + 'data_json' => $connection->raw('CAST(CONVERT(data USING utf8mb4) AS JSON)'), ]); } @@ -38,18 +46,21 @@ }, 'down' => function (Builder $schema) { - if ($schema->getConnection()->getDriverName() === 'pgsql') { - $notifications = $schema->getConnection()->getSchemaGrammar()->wrapTable('notifications'); - $data = $schema->getConnection()->getSchemaGrammar()->wrap('data'); - $schema->getConnection()->statement("ALTER TABLE $notifications ALTER COLUMN $data TYPE BYTEA USING data::TEXT::BYTEA"); + $connection = $schema->getConnection(); + $driver = $connection->getDriverName(); + + if ($driver === 'pgsql') { + $notifications = $connection->getSchemaGrammar()->wrapTable('notifications'); + $data = $connection->getSchemaGrammar()->wrap('data'); + $connection->statement("ALTER TABLE $notifications ALTER COLUMN $data TYPE BYTEA USING data::TEXT::BYTEA"); } else { $schema->table('notifications', function (Blueprint $table) { $table->binary('data_binary')->nullable(); }); - if ($schema->getConnection()->getDriverName() === 'mysql') { - $schema->getConnection()->table('notifications')->update([ - 'data_binary' => $schema->getConnection()->raw('data'), + if ($driver === 'mysql') { + $connection->table('notifications')->update([ + 'data_binary' => $connection->raw('data'), ]); }