2010-04-29 4 views
2

je voudrais faire quelque chose comme ceci:Zend_Db_Select: conditions de regroupement dans l'article où

$select = $myTbl->select() 
->from('download_log') 
->joinLeft(...... etc........ 
->joinLeft(...... etc........ 
->joinLeft(...... etc........); 

//Filter all configured bots (Google, Yahoo, etc.) 
if(isset($this->_config->statistics->bots)){ 
$bots = explode(',',$this->_config->statistics->bots); 
foreach ($bots as $bot){ 
    $select = $select->where("user_agent NOT LIKE '%$bot%'"); 
} 
} 

$select = $select->where("download_log.download_log_ts BETWEEN '".$start_date." 00:00:00' AND '".$end_date." 23:59:59'"); 

Mais la requête outputed n'est pas correct en raison des clauses orWhere ne sont pas regroupées dans un unique et la clause. Je voudrais savoir s'il est possible de regrouper ces clauses NOT LIKE dans une paire de parenthèses.

Mon courant alternatif est la suivante:

//Filter all configured bots (Google, Yahoo, etc.) 
    if(isset($this->_config->statistics->bots)){ 
    $bots = explode(',',$this->_config->statistics->bots); 
    foreach ($bots as $bot){ 
    $stmt .= "user_agent NOT LIKE '%$bot%' AND "; 
    } 
    $stmt = substr($stmt,0,strlen($stmt)-4); //remove the last OR 
    $select = $select->where("($stmt)"); 
    } 

Merci!

Répondre

0

Votre alternative actuelle semble être la meilleure option. Voici une Wich version légèrement modifiée utilise en citant bon juste au cas où quelque chose de mauvais glisse dans les robots collecteurs $

$botWhere = ''; 
foreach ($bots as $bot){ 
    $botWhere .= $myTbl->getAdapter()->quoteInto('user_agent NOT LIKE ? AND ', "%$bot%"); 
} 
$botWhere = trim($botWhere, ' AND '); 
$select = $select->where($botWhere); 
0

Zend_Db_Select prend en charge la clause orWhere qui est ce que vous cherchez.

1

Merci! J'ai finalement fait comme ça:

Questions connexes