2010-04-29 2 views
2

Я хотел бы сделать что-то вроде этого:Zend_Db_Select: перегруппировка условия, где положение

$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'"); 

Но outputed запрос не является правильным, поскольку из положений orWhere не сгруппированы вместе в уникальном предложении. Я хотел бы знать, можно ли перегруппировать те предложения NOT LIKE в пару parentheres.

Моя текущая альтернатива заключается в следующем:

//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)"); 
    } 

Спасибо!

ответ

0

Ваш нынешний вариант выглядит как лучший вариант. Вот немного измененная версия, в которой используется правильное цитирование только в случае, если что-то плохое проскальзывает в $ bots

$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 поддерживает пункт orWhere, который является тем, что вы ищете.

1

Спасибо! Я, наконец, сделал это так:

//Filter all configured bots (Google, Yahoo, etc.) 
if(isset($this->_config->statistics->bots)){ 
     $bots = explode(',',$this->_config->statistics->bots); 
     foreach ($bots as $bot){ 
       $stmt .= $myTbl->getAdapter()->quoteInto("user_agent NOT LIKE ? AND ",%$bot%); 
     } 
     $stmt = trim($stmt, ' AND '); //remove the last AND 
     $stmt .= 'OR user_agent IS NULL'; 
     $select = $select->where("($stmt)"); 
}