2011-08-23 45 views
0

我嘗試進行通用更新/交換,這將始終切換活動狀態。在SQL中很簡單:帶交換值表達式的zend框架更新

UPDATE contacts SET active = ABS(active - 1) WHERE id = .... 

其中活動是小int /標誌0或1,所以它始終工作。

當我嘗試實現它來模擬類擴展Zend_Db_Table類:

public function disableContact($contact_id) 
{ 
    $where = $this->getAdapter()->quoteInto('id = ?', $contact_id); 
    $data = Array(); 
    $data ['active'] = '(ABS(the.contacts.active - 1))'; 

    return parent::update($data, $where); 
} 

Error: SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for integer: "(ABS(the.contacts.active - 1))"<p><pre>#0 ......./ZendFramework-1.11.0/library/Zend/Db/Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array)

如何通過ABS表達更新?

回答

3

使用Zend_Db_Expr,如

// Updated with zerkms' much simpler bit flipping logic 
$data['active'] = new Zend_Db_Expr('1 - the.contacts.active'); 

我可以在手冊中找到的最好的例子是用於插入數據,但概念是相同的。請參閱http://framework.zend.com/manual/en/zend.db.table.html#zend.db.table.insert

僅供參考Zend_Db_Select可識別包含在括號內的值並將它們視爲表達式。

+2

+1。 'ABS'在這裏是不必要的:'1 - the.contacts.active'將返回你需要的東西 – zerkms

+0

Zend_Db_Expr完美工作 - 謝謝。 '1-active'也是一個好主意 - 謝謝 – bensiu