Zend framework 使用Zend_Db_Table_Abstract对WHERE子句进行分组
有人知道用Zend_Db对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); 这给了
$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));