带有交换值表达式的zend框架更新

时间:2011-08-23 03:34:22

标签: php zend-framework zend-db-table

我尝试进行通用更新/交换,这将始终切换活动状态。在SQL中很简单:

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

当active为small int / flag 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表达式进行更新?

1 个答案:

答案 0 :(得分: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

FYI仅Zend_Db_Select识别包含在括号中的值并将其视为表达式。