connectionPool->getQueryBuilderForTable('be_users'); $connection = $queryBuilder->getConnection(); $result = $queryBuilder ->select('uid', 'user_settings') ->from('be_users') ->where( $queryBuilder->expr()->like('user_settings', $queryBuilder->quote('"{%}"')), ) ->executeQuery(); while ($row = $result->fetchAssociative()) { $userSettings = json_decode( json: json_decode( json: $row['user_settings'], flags: JSON_THROW_ON_ERROR | JSON_OBJECT_AS_ARRAY ), flags: JSON_THROW_ON_ERROR | JSON_OBJECT_AS_ARRAY, ); if (!is_array($userSettings)) { continue; } $connection->update( 'be_users', [ // The array must be passed directly to prevent double JSON encoding. // See: https://review.typo3.org/c/Packages/TYPO3.CMS/+/89293 'user_settings' => $userSettings, ], [ 'uid' => (int)($row['uid']), ], [ // @todo This behavior cannot be modified yet; the array value must be passed directly // until https://review.typo3.org/c/Packages/TYPO3.CMS/+/89293 is merged, // otherwise the value will be JSON-encoded twice. 'user_settings' => Type::getType(Types::JSON), ], ); } return $this->updateNecessary() === false; } public function updateNecessary(): bool { $queryBuilder = $this->connectionPool->getQueryBuilderForTable('be_users'); return (bool)($queryBuilder ->count('*') ->from('be_users') ->where( $queryBuilder->expr()->like('user_settings', $queryBuilder->quote('"{%}"')), ) ->executeQuery() ->fetchOne()); } }