Обновление Zend Framework с выражением подкачки - PullRequest
0 голосов
/ 23 августа 2011

Я пытаюсь сделать универсальное обновление / своп, который всегда переключал бы активный статус. В SQL все просто:

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

Там, где активным является маленький 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 Ответ

3 голосов
/ 23 августа 2011

Используйте 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 распознает значения, заключенные в скобки, и обрабатывает их как выражения.

...