使用Zend_Db_Table_Abstract将WHERE子句分组

Mar*_*ark 35 zend-framework zend-db-table

有没有人知道如何将Zend_Db的子句分组?基本上我有这个查询

$sql = $table->select()
             ->where('company_id = ?', $company_id)
             ->where('client_email = ?', $client_email)
             ->orWhere('client_email_alt = ?', $client_email);
Run Code Online (Sandbox Code Playgroud)

哪个给了我这个:

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

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

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

jas*_*son 55

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

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

$select->where('client_email = ? OR client_email_alt = ?', $client_email)
Run Code Online (Sandbox Code Playgroud)

如果字符串中有多个占位符,则DB适配器的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 
Run Code Online (Sandbox Code Playgroud)


Vol*_*vox 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));
Run Code Online (Sandbox Code Playgroud)