Zend framework 使用Zend_Db_Table_Abstract对WHERE子句进行分组

Zend framework 使用Zend_Db_Table_Abstract对WHERE子句进行分组,zend-framework,zend-db-table,Zend Framework,Zend Db Table,有人知道用Zend_Db对where子句进行分组的方法吗?基本上我有这个疑问 $sql = $table->select() ->where('company_id = ?', $company_id) ->where('client_email = ?', $client_email) ->orWhere('client_email_alt = ?', $client_email); 这给了

有人知道用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'))

为了实现这一点,您必须在对
where
方法的单个调用中构造grouped子句

如果条件的两个值相同,则可以执行以下操作:

$select->where('client_email = ? OR client_email_alt = ?', $client_email)
如果字符串中有多个占位符,DB适配器的
quoteInto
方法将用提供的值替换所有占位符

如果需要将
与每个字段的不同值分组,则必须手动引用这些值。这有点复杂:

$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 
您可以使用
getPart()
获取WHERE语句,然后连接子查询

$select->where('client\u email=?',$client\u email)
->或where('client\u email\u alt=?',$client\u email);
$subquery=$select->getPart(Zend\u Db\u select::WHERE);
$select->reset(Zend_Db_select::WHERE);
$select->where('company\u id=?',$company\u id)
->其中(内爆(“”,$subquery));

对于Zend Framework版本2,情况略有不同:


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

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

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

$subquery = $subquery->getPart(Zend_Db_Select::WHERE);
$select->where(implode(' ',$subquery));
$subquery=$db->select();
$subquery->orWhere('a>10');

$subquery->orWhere('b我需要组合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));

我们需要的是$select->startWhereGroup()和$select->endWhereGroup()。Zend Framework 2\Zend\Db\Sql\select在这方面看起来很有希望。太棒了!谢谢Jason,我已经寻找这个解决方案很久了。它就像是一种享受。谢谢:)
$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));