Actualmente tengo una gran lista de entradas en mi TYPO3 Ext que hace que el sitio tenga tiempos de carga bastante bajos, por lo que quiero dividir la lista de entradas alfabéticamente. Para eso, estoy usando queryBuilder para seleccionar solo esas entradas, que comienzan con a, b, cy así sucesivamente. Pero estoy atascado ahora cuando se trata de números y caracteres especiales. Encontré esto: MySQL: si comienza con un número o un carácter especial , que es exactamente lo que necesito. Pero no tengo idea de cómo hacer un REGEXP en queryBuilder. ¿Alguien puede ayudar?
La versión de TYPO3 es 10.4.6
Gracias por adelantado
Sugeriría usar LIKE para encontrar cadenas que comiencen con un carácter dado.
$firstCharacter = 'A'; $q = GeneralUtility::makeInstance(ConnectionPool::class) ->getQueryBuilderForTable('mytable'); $q->select('field') ->from('mytable') ->where( $q->expr()->orX( $q->expr()->like( 'field', $q->quote(strtolower($firstCharacter) . '%') ), $q->expr()->like( 'field', $q->quote(strtoupper($firstCharacter) . '%') );Por supuesto, las mayúsculas y minúsculas podrían omitirse si el DBMS no distingue entre mayúsculas y minúsculas.
@eliashaeussler dio un buen ejemplo de eso.
Si bien LIKE es compatible con Doctrine dbal, REGEXP no lo es. Perdería la compatibilidad entre DBMS. Esto probablemente esté bien si se dirige a un sitio específico, pero, por supuesto, no debe usarse en extensiones públicas.
Quizás te funcione algo como esto:
use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($tableName); $result = $queryBuilder->select('*') ->from($tableName) ->where( $queryBuilder->expr()->comparison( $queryBuilder->quoteIdentifier($fieldName), 'NOT REGEXP', $queryBuilder->createNamedParameter('^[[:alpha:]]') ) ) ->execute() ->fetchAll(); Esto crea una consulta como esta (suponiendo $tableName = 'foo' y $fieldName = 'baz' ):
SELECT `foo`.* FROM `foo` WHERE `foo`.`baz` NOT REGEXP '^[[:alpha:]]'