db->getQueryBuilder(); $select->select('userid') ->from('preferences') ->where($select->expr()->eq('appid', $select->expr()->literal('photos'))) ->andWhere($select->expr()->eq('configkey', $select->expr()->literal('photosSourceFolders'))); $result = $select->executeQuery(); $alreadyMigrated = array_map(static fn (array $row) => $row['userid'], $result->fetchAll()); $result->closeCursor(); // Remove old entries for users who already have the new one $delete = $this->db->getQueryBuilder(); $delete->delete('preferences') ->where($delete->expr()->eq('appid', $delete->expr()->literal('photos'))) ->andWhere($delete->expr()->eq('configkey', $delete->expr()->literal('photosSourceFolder'))) ->andWhere($delete->expr()->in( 'userid', $delete->createParameter('chunk'), IQueryBuilder::PARAM_STR )); $chunks = array_chunk($alreadyMigrated, 1000); foreach ($chunks as $chunk) { $delete->setParameter('chunk', $chunk, IQueryBuilder::PARAM_STR_ARRAY); $delete->executeStatement(); } // Update remaining old entries to new ones $update = $this->db->getQueryBuilder(); $update->update('preferences') ->set('configvalue', $update->func()->concat($update->createNamedParameter('["'), 'configvalue', $update->createNamedParameter('"]'))) ->set('configkey', $update->expr()->literal('photosSourceFolders')) ->where($update->expr()->eq('appid', $update->expr()->literal('photos'))) ->andWhere($update->expr()->eq('configkey', $update->expr()->literal('photosSourceFolder'))) ->executeStatement(); } }