2009-07-24 46 views
33

Có ai biết cách để nhóm các mệnh đề với Zend_Db không? Về cơ bản tôi có truy vấn nàyNhóm các mệnh đề WHERE với Zend_Db_Table_Abstract

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

Đó là đem lại cho tôi điều này:

SELECT `clients`.* FROM `clients` WHERE (company_id = '1') AND (client_email = '[email protected]') OR (client_email_alt = '[email protected]') 

Nhưng tôi cần nó để cho tôi này, nơi OR tuyên bố được theo nhóm:

SELECT `clients`.* FROM `clients` WHERE (company_id = '1') AND ((client_email = '[email protected]') OR (client_email_alt = '[email protected]')) 

Trả lời

51

Để để đạt được điều này, bạn phải xây dựng mệnh đề được nhóm trong một cuộc gọi đến phương thức where.

Nếu cả hai giá trị của điều kiện đều giống nhau, bạn có thể làm điều này:

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

Nếu có nhiều placeholders trong chuỗi, phương pháp adapter DB quoteInto sẽ thay thế tất cả placeholders với giá trị cung cấp.

Nếu bạn cần nhóm OR với các giá trị khác nhau cho mỗi trường, bạn phải tự trích dẫn các giá trị. Hơi phức tạp hơn một chút:

$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 
+0

chính xác những gì tôi đang tìm kiếm, cảm ơn bạn – Mark

+1

Điều chúng tôi cần là $ select-> startWhereGroup() và $ select-> endWhereGroup(). –

+1

Zend Framework 2 \ Zend \ Db \ Sql \ Select có vẻ đầy hứa hẹn trong lĩnh vực này. –

6

Bạn có thể sử dụng getPart() để nhận câu WHERE và sau đó kết nối các truy vấn phụ.

$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)); 
0

Trong lần đầu tiên bạn có thể tạo subquery, sau đó nhận được "WHERE" phần và chèn vào truy vấn chính

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

$subquery = $subquery->getPart(Zend_Db_Select::WHERE); 
$select->where(implode(' ',$subquery)); 
0

tôi cần phải kết hợp AND/OR nhưng bao gồm HOẶC báo cáo có điều kiện, bổ sung chúng chỉ trong một số trường hợp. Giải pháp này là một sự thích nghi của những gì tôi đã làm, dựa trên những sửa đổi nhỏ của câu trả lời được chấp nhận.

$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)); 
Các vấn đề liên quan