我尝试进行通用更新/交换,这将始终切换活动状态。在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表达式进行更新?
答案 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
识别包含在括号中的值并将其视为表达式。