36

有谁知道用 Zend_Db 对 where 子句进行分组的方法?基本上我有这个查询

$sql = $table->select()
             ->where('company_id = ?', $company_id)
             ->where('client_email = ?', $client_email)
             ->orWhere('client_email_alt = ?', $client_email);

这给了我这个:

SELECT `clients`.* FROM `clients` WHERE (company_id = '1') AND (client_email = 'email@address.com') OR (client_email_alt = 'email@address.com')

但我需要它给我这个,OR 语句被分组的地方:

SELECT `clients`.* FROM `clients` WHERE (company_id = '1') AND ((client_email = 'email@address.com') OR (client_email_alt = 'email@address.com'))
4

5 回答 5

57

为了实现这一点,您必须在对该where方法的一次调用中构造分组子句。

如果两个条件值相同,您可以这样做:

$select->where('client_email = ? OR client_email_alt = ?', $client_email)

如果字符串中有多个占位符,则数据库适配器的quoteInto方法将使用提供的值替换所有占位符。

如果您需要OR对每个字段使用不同的值进行分组,则必须手动引用这些值。它有点复杂:

$select->where(
    $db->quoteInto('client_email = ?', $email1) . ' OR ' . $db->quoteInto('client_email_alt = ?', $email2)
); // $db is your instance of Zend_Db_Adapter_*
   // You can get it from a Zend_Db_Table_Abstract 
   //subclass by calling its getAdapter() method 
于 2009-07-24T18:39:24.390 回答
6

您可以使用getPart()获取 WHERE 语句然后连接子查询。

$select->where('client_email = ?', $client_email)
       ->orWhere('client_email_alt = ?', $client_email);

$subquery = $select->getPart(Zend_Db_Select::WHERE);
$select ->reset(Zend_Db_Select::WHERE);
$select ->where('company_id = ?', $company_id)
        ->where(implode(' ',$subquery));
于 2013-02-08T09:38:52.183 回答
1

对于 Zend Framework 第 2 版,情况有所不同:

请参阅http://framework.zend.com/apidoc/2.2/classes/Zend.Db.Sql.Predicate.Predicate.html#nest

$table->select()
     ->where(['company_id'=> $company_id])
     ->nest
         ->where('client_email = ?', $client_email)
         ->or
         ->where('client_email_alt = ?', $client_email)
     ->unnest();

工作正常,感觉比 ZF1 方法干净得多。

于 2014-11-12T14:41:30.297 回答
1

我需要组合 AND/OR 语句,但有条件地包括 OR 语句,仅在某些情况下添加它们。这个解决方案是对我所做的事情的改编,基于对已接受答案的小修改。

$sql = $table->select()
         ->where('company_id = ?', $company_id);

$orWhereClauses = [];
// We could add a conditional statement to add this statement
$orWhereClauses[] = $db->quoteInto('client_email = ?', $email1);
// Same applies to this statement
$orWhereClauses[] = $db->quoteInto('client_email_alt = ?', $email2);

$sql->where(implode(" OR ", $orWhereClauses));
于 2016-04-26T13:34:13.103 回答
0

首先,您可以生成子查询,然后获取“WHERE”部分并插入主查询

$subquery = $db->select();
$subquery->orWhere('a>10');
$subquery->orWhere('b<20');
etc..

$subquery = $subquery->getPart(Zend_Db_Select::WHERE);
$select->where(implode(' ',$subquery));
于 2015-02-20T14:11:51.037 回答