2017-09-27 8 views
0

Comment ajouter dynamiquement des conditions supplémentaires aux clauses 'WHERE' dans les requêtes de base de données TYPO3, s'il vous plaît? Les nouveaux docs de TYPO3 version 8 indiquent comment faire des requêtes fixes, mais pas de variables.Comment créer une clause SQL 'WHERE' dynamique à l'aide de TYPO3 Querybuilder

Dans le passé, je pouvais créer une instruction SQL et modifier dynamiquement comme ceci:

if (condition) { 
    $strWhere = 'some SQL'; 
} else { 
    $strWhere = 'same SQL with extra bits'; 
} 

$dbRes = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
    "*",   // SELECT ... 
    "tableName", // FROM ... 
    $strWhere ,  // WHERE... 
    etc. 

Je ne vois pas comment faire quelque chose comme cela en utilisant QueryBuilder. Ce que je veux accomplir est une expression qui fait quelque chose comme ça

if (condition) { 
    ->where($queryBuilder->expr()->eq(...)) 
    } 
else { 
    ->where($queryBuilder->expr()->eq(...)) 
    ->andWhere($queryBuilder->expr()->eq(...)) 
} 

Les indices seraient grandement appréciés. Merci.

+0

à peu près exactement comme vous le suggérez là-bas. Vous pouvez collecter plusieurs conditions where ($ queryBuilder-> expr()) dans un tableau, puis utiliser orX ou andX pour les connecter: $ queryBuilder-> etWhere ($ queryBuilder-> expr() -> orX (.. $ yourWhereExperessions) – deadfishli

+0

Merci deadfishli, c'est très utile et gentil de votre part de répondre. –

Répondre

2

Résolu. Mon erreur a été de penser que les différentes parties d'une instruction de constructeur de requête DOIVENT se rencontrer - ce n'est pas le cas.

donc ceci:

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_tablename'); 

$queryBuilder 
    ->select('uid', 'header', 'bodytext') 
    ->from('tt_content') 
    ->where(
     $queryBuilder->expr()->eq('bodytext', $queryBuilder->createNamedParameter('klaus')), 
     $queryBuilder->expr()->eq('header', $queryBuilder->createNamedParameter('a name')) 
    ) 
    ->execute(); 

peut également être divisé en plusieurs parties, telles que:

switch ($scope) { 
    case 'limitfields': 
     $queryBuilder->select('uid','header','bodytext'); 
     break; 

    default: 
     $queryBuilder->select('*'); 
     break; 
    } 

$queryBuilder 
    ->from('tt_content') 
    ->where(
     $queryBuilder->expr()->eq('bodytext', $queryBuilder->createNamedParameter('klaus')), 
     $queryBuilder->expr()->eq('header', $queryBuilder->createNamedParameter('a name')) 
    ) 
    ->execute(); 
0
$queryBuilder = GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Database\\ConnectionPool')->getQueryBuilderForTable('tx_igldapssoauth_config'); 

$expressionBuilder = $queryBuilder->expr(); 

$conditions = $expressionBuilder->andX(); 
$conditions->add(
    $expressionBuilder->eq('somefield', 1) 
); 
$conditions->add(
    $expressionBuilder->eq('someotherfield', 2) 
); 

$rows = $queryBuilder->select('*') 
->from('tx_igldapssoauth_config') 
->where(
    $queryBuilder->expr()->eq('uid', 1) 
) 
->andWhere($conditions) 
->execute()->fetchAll();