开发者

Zend_Db_Select: regrouping conditions in where clause

开发者 https://www.devze.com 2022-12-28 09:32 出处:网络
I would like to do something like this: $select = $myTbl->select() ->from(\'download_log\') ->joinLeft(...... etc........

I would like to do something like this:

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

But the outputed query is not correct because of the orWhere clauses are not grouped together in a unique AND clause. I would like to know if it is possible to regrouped those NOT LIKE clauses in a pair of parentheres.

My current alternative is the following:

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

Thanks!


Thanks! I finally did it like that:

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


Your current alternative looks to be the best option. Here's a slightly altered version wich uses proper quoting just in case anything bad slips into $bots

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


Zend_Db_Select supports the orWhere clause which is what your looking for.

0

精彩评论

暂无评论...
验证码 换一张
取 消